Russian Qt Forum
Ноябрь 22, 2024, 18:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsView  (Прочитано 6342 раз)
zagruzkaaa
Гость
« : Июль 08, 2015, 19:01 »

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Июль 14, 2015, 23:47 »

как перегрузить wheelEvent, что бы после него выполнялись определенные действия, но только в том случае если он не вызывается повторно последние 5 сек

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

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

« Последнее редактирование: Июль 14, 2015, 23:53 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 15, 2015, 08:54 »

Требуется загрузить огромную картинку в QGraphicsView в виде блоков по 500-1000 пикселей, попробовал это сделать через QImageReader + setClipRect + read() + конвертирование из qimage в qpixmap , ну все работает, но работает ну ОЧЕНЬ долго, как это можно сделать быстрее?
Порезать на "порционные куски". Если большой исходный имедж влазит в память, то сначала грузите его весь и сохраняете кусок за куском на диске, желательно в своем, неупакованном формате. Если не влазит -  читаете тем же QImageReader порциями по N строк
Записан
_Vitaliy_
Гость
« Ответ #3 : Июль 22, 2015, 18:25 »

В книге у Андрея Боровского "Qt4.7+. Практическое программирование на C++" есть интересующий Вас вопрос (ИМХО) глава 9: "Виджет для вывода больших изображений......299"
Записан
Pritcher
Гость
« Ответ #4 : Январь 22, 2016, 09:00 »

По поводу таймера. Можно сделать проще, чем описал Гурман.

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

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

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

// необходимые вам действия
        _timer.restart();
}
« Последнее редактирование: Январь 23, 2016, 03:42 от Pritcher » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Январь 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 секунд его не крутили.
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 24.