QT: как обрабатывать движение мыши без клика
В QT, разумеется, есть обработчик mouseMoveEvent
события движения мыши, но по умолчанию он срабатывает, только если мышь двигается с зажатой кнопкой. С помощью метода setMouseTracking
это легко исправить. Мы собираемся написать виджет, позволяющий отслеживать и выводить цвет пиксела рисунка, на который наведён курсор мыши. Сам рисунок при этом будем генерировать в обработчике события paintEvent
так, чтобы он занимал всю свободную область канвы формы. Пусть это будет какой-нибудь градиент.
Создадим проект - потомок QWidget
, в файле widget.h
подключим нужные библиотеки, опишем картинку, рисовальщик и позицию курсора, а также прототипы двух методов, обрабатывающих события mouseMoveEvent
и paintEvent
, вот полный текст файла:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPainter> #include <QMouseEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; QImage img; QPainter painter; QPoint position; protected: virtual void paintEvent(QPaintEvent *); virtual void mouseMoveEvent(QMouseEvent *); }; #endif // WIDGET_H
В конструкторе класса из файла widget.cpp
добавим строчку
ui->setupUi(this); this->setMouseTracking(true); //включить слежение за мышью
и реализуем оба метода класса:
void Widget::mouseMoveEvent(QMouseEvent *event) { position = event->pos(); //позиция курсора QRgb pixel; //пиксел рисунка try { pixel = img.pixel(position); } catch(...) { return; }; QString str = QString::number(qRed(pixel))+QString(",")+ QString::number(qGreen(pixel))+QString(",")+ QString::number(qBlue(pixel)); //получить строку с интенсивностями цветовых компонент setWindowTitle( QString::number(position.x())+ QString(",")+ QString::number(position.y())+ QString(": ")+str ); //показать информацию в заголовке окна } void Widget::paintEvent(QPaintEvent *event) { QImage img(this->width(),this->height(),QImage::Format_RGB32); //сгенерировать картинку во всю свободную область канвы QRgb rgb; for (int x=0; x<this->width(); x++) { //подготовить вертикальный for (int y=0; y<this->height(); y++) { //градиент int c = qRound(y*255./(this->height()-1)); rgb = qRgb(c,c,c); img.setPixel (x,y,rgb); } } img.invertPixels(); //инвертировать цвета - просто так :) painter.begin(this); painter.drawImage(0,0,img); //отрисовка painter.end(); this->img = img; }
Приложение работает, вот что вышло:

скриншот работы приложения
Скачать этот проект QT5 в архиве .zip (2 Кб)
21.05.2016, 09:44 [11223 просмотра]