Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: zagruzkaaa от Июль 08, 2015, 19:01



Название: QGraphicsView
Отправлено: zagruzkaaa от Июль 08, 2015, 19:01
Требуется загрузить огромную картинку в QGraphicsView в виде блоков по 500-1000 пикселей, попробовал это сделать через QImageReader + setClipRect + read() + конвертирование из qimage в qpixmap , ну все работает, но работает ну ОЧЕНЬ долго, как это можно сделать быстрее? спасибо + еще вопрос как перегрузить wheelEvent, что бы после него выполнялись определенные действия, но только в том случае если он не вызывается повторно последние 5 сек


Название: Re: QGraphicsView
Отправлено: Гурман от Июль 14, 2015, 23:47
как перегрузить wheelEvent, что бы после него выполнялись определенные действия, но только в том случае если он не вызывается повторно последние 5 сек

это тривиально - достаточно в классе иметь QBasicTimer, который в начале wheelEvent проверяется на isActive(), и если true, то stop() этому таймеру, а в конце wheelEvent этот таймер запускается на 5 секунд и ему передается this этого объекта, и в этом же объекте надо переопределить метод timerEvent, в котором делать "определенные действия" при получении события о срабатывании таймера - подробности в описании QBasicTimer и множестве примеров

увы, насчет загрузки БОЛЬШИХ изображений на QGraphicsView ничего не скажу, честно говоря, с трудом представляю, зачем такое надо грузить именно на QGraphicsView - этот класс предназначен для отображения части QGraphicsScene, о чём явно написано в документации, картинки же прекрасно грузятся на QLabel через QPixmap, я это делал вполне успешно по документации, всё летало с крупными фотографиями



Название: Re: QGraphicsView
Отправлено: Igors от Июль 15, 2015, 08:54
Требуется загрузить огромную картинку в QGraphicsView в виде блоков по 500-1000 пикселей, попробовал это сделать через QImageReader + setClipRect + read() + конвертирование из qimage в qpixmap , ну все работает, но работает ну ОЧЕНЬ долго, как это можно сделать быстрее?
Порезать на "порционные куски". Если большой исходный имедж влазит в память, то сначала грузите его весь и сохраняете кусок за куском на диске, желательно в своем, неупакованном формате. Если не влазит -  читаете тем же QImageReader порциями по N строк


Название: Re: QGraphicsView
Отправлено: _Vitaliy_ от Июль 22, 2015, 18:25
В книге у Андрея Боровского "Qt4.7+. Практическое программирование на C++" есть интересующий Вас вопрос (ИМХО) глава 9: "Виджет для вывода больших изображений......299"


Название: Re: QGraphicsView
Отправлено: Pritcher от Январь 22, 2016, 09:00
По поводу таймера. Можно сделать проще, чем описал Гурман.

Создаете объект класса QTime, запускаете его методом start(). В wheelEvent вставляется проверку на пройденное время. Если прошло менее 5 секунд, то выходите из события, иначе выполняете действия, необходимые вам.

Код примерно следующий
Код:
void Widget::wheelEvent( QWheelEvent * event )
{
// ... стандартные действие
// например
// QGraphicsView::wheelEvent( event );

if ( _timer.elapsed() < 5000 )
return;

// необходимые вам действия
        _timer.restart();
}


Название: Re: QGraphicsView
Отправлено: Гурман от Январь 27, 2016, 15:40
По поводу таймера. Можно сделать проще, чем описал Гурман.

Создаете объект класса QTime, запускаете его методом start(). В wheelEvent вставляется проверку на пройденное время. Если прошло менее 5 секунд, то выходите из события, иначе выполняете действия, необходимые вам.

Код примерно следующий
Код:
void Widget::wheelEvent( QWheelEvent * event )
{
// ... стандартные действие
// например
// QGraphicsView::wheelEvent( event );

if ( _timer.elapsed() < 5000 )
return;

// необходимые вам действия
        _timer.restart();
}

Это не "проще" - это работает иначе и не так, как требовалось. "Необходимые действия" выполнятся только если через 5 секунд покрутят колёсико. Если колёсико вообще не покрутят, то действия не выполнятся никогда. А надо сделать так, чтобы они выполнились, если в течение 5 секунд его не крутили.