В Qt есть очень универсальный способ, позволяющий обработать клик практически на любом элементе формы, у которого даже нет сигнала clicked(). Если вы имеете дело с производным от класса QWidget достаточно реализовать приватную, виртуальную функцию

mousePressEvent, которая имеет вот такой прототип:

void mousePressEvent ( QMouseEvent * event );

К примеру, вы используете библиотеку QWT для графиков и хотите, чтобы по клику на графике открывалось окно с более подробными данными. Необходимо создать такую обёртку:

Файл plot.h:

  1. #ifndef PLOT_H 
  2. #define PLOT_H
  3.        
  4. #include "qwt_plot.h"
  5.        
  6. class plot : public QwtPlot
  7. {
  8.     Q_OBJECT
  9. public:
  10.     explicit plot(QWidget *parent = 0);
  11.        
  12. private:       
  13.     void mousePressEvent ( QMouseEvent * event );      
  14. signals:         
  15.        
  16. public slots:  
  17. };

Файл plot.cpp:

  1. #include "plot.h"
  2. #include "flypage.h"
  3.  
  4. plot::plot(QWidget *parent) :
  5.     QwtPlot(parent)
  6. {
  7. }
  8.  
  9. void plot::mousePressEvent (QMouseEvent *event)
  10. {
  11.     // do not firing any event besides code below becose event allready handled
  12.     event->accept();
  13.  
  14.     QMap<QString, QString> pmap;
  15.     pmap.insert ("tempPlot", "temp");
  16.     pmap.insert ("humPlot", "humidity");
  17.     pmap.insert ("pressPlot", "pressure");
  18.     QString flyPageMode;
  19.     flyPageMode = pmap [objectName()];
  20.  
  21.     if (!flyPageMode.isEmpty())
  22.     {
  23.         flyPage *fp = new flyPage;
  24.         fp->setRenderMode (flyPageMode);
  25.         // talking QDialog not store window after close() method
  26.         fp->setAttribute( Qt::WA_DeleteOnClose );
  27.         fp->fdata->get();
  28.         fp->show();
  29.     }
  30.  
  31. }

Поговорим о приведённом коде обёртки для виджета QwtPlot. Обратите внимание на первую строчку под комментарием - таким образом мы даём понять, что нас не интересуют никакие действия, которые могли бы быть определены у виджета по-умолчанию. Такое поведение может быть не всегда ожидаемым, и в некоторых случаях было бы резонно вызвать код, который замещается данным классом, естественно передав ему перехваченный event:

QwtPlot::mousePressEvent(event);

Кстати event имеет функцию pos(), через которую можно узнать координаты клика.

Вообще говоря о событиях Qt, стоит отметить, что случившийся Event "распространяется" по всем возможным инстанциям. У вас могут быть веские причины вызвать event->ignore(), чтобы event пролетел мимо вашего обработчика и достиг какого-нибудь другого. Полезно, в случае если вы добавляете что-то своё, к уже существующему функционалу виджета.

Так же существуют event-функции, возвращающие bool значение, в зависимости от которого определяется обработан event или нет (true - обработан, false - нет).

Более подробные сведения вы найдёте в документации.



Статью пока никто не комментировал. Ваш комментарий может стать первым.

Войдите или зарегистрируйтесь, чтобы написать комментарий.