БлогNot. QT: как обрабатывать движение мыши без клика

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 [10629 просмотров]


теги: программирование c++ графика qt

К этой статье пока нет комментариев, Ваш будет первым