Проблема обработки событий мыши QT - PullRequest
1 голос
/ 16 сентября 2010

Привет всем,

Как видно на картинке

http://i51.tinypic.com/2r56s1j.jpg

У меня есть расширенный объект QWidget (который рисует изображения ячеек и некоторые данные счетчика) внутри QScrollBar. Пользователь может увеличивать / уменьшать изображение (размер QWidget изменяется в соответствии с увеличенным размером QImage) с помощью колесика мыши.

Я обрабатываю события (mouseMoveEvent (), wheelEvent () и т. Д.), Реализуя методы слушателя в QWidget. Моя проблема в том, что я могу выполнять масштабирование (и другие события), только когда указатель мыши находится над QWidget. Если точка мыши находится над QScrollBar (серая область на изображении), эти события используются QScroolBar.

Любые советы,

[Изменить] Извините, я ссылался на QScrollArea, а не на QScrollBar.

спасибо, umanga

Ответы [ 3 ]

1 голос
/ 16 сентября 2010

Я не уверен, хотите ли вы, чтобы колесо масштабирования только когда-либо использовалось для масштабирования изображения, или если вы хотите, чтобы колесо прокрутки управляло масштабированием, когда изображение меньше, чем область просмотра области прокрутки, а затемиспользуйте колесо прокрутки для прокрутки, когда изображение больше, чем область просмотра области прокрутки.В любом случае вы должны иметь возможность настроить способ обработки колеса следующим образом:

Поскольку я на самом деле не пробовал этот диск, я не уверен, будет ли он работать.Есть надежда, что если вы установите фильтр событий и установите ignore для события, событие все равно будет распространено обратно в ваш виджет изображения.Это позволит вам оставить текущую обработку мыши в виджете изображения без изменений.

bool YourImageWidget::eventFilter(QObject *obj, QEvent *event)
{
    if((obj == scrollAreaPointer) && (event->type() == QEvent::Wheel))
    {
        if(!scrollAreaShouldHandleWheel)
        {
            event->ignore();
        }
    }
    return false; // always pass the event back to the scroll area
}

Флаг scrollAreaShouldHandleWheel является логическим значением, которое вы устанавливаете из виджета изображения в зависимости от того, хотите ли вы иметь область прокрутки.для обработки событий колеса.

Где-то в вашем коде вы бы установили свой виджет изображения в качестве фильтра событий для scrollarea.

scrollArea->installEventFilter(imageWidget);

Если это не работает, вы всегда можете использоватьэтот фильтр, чтобы убедиться, что ваш виджет получает событие и обрабатывает его напрямую, а затем возвращает true, чтобы область прокрутки не смогла получить событие.

1 голос
/ 16 сентября 2010

Я рекомендую вам использовать QGraphicsScene и QGraphicsView.Графический фреймворк уже предоставляет множество полезных функций (включая преобразование области просмотра).И QGraphicsView - это область прокрутки.

0 голосов
/ 16 сентября 2010

Вы сделали grabMouse() для Qwidget, т. Е. Для того, который вы отображаете изображение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...