У меня была такая же проблема, я пришел к следующему дизайну решения:
В моем основном виджете я хотел бы обрабатывать события наведения некоторых выбранных объектов. По этой причине я создал 2 слота на моем MainWindow
:
public slots:
void onHoverIn(QObject* object);
void onHoverOut(QObject* object);
Затем я создал класс фильтра событий следующим образом:
hovereventfilter.h
#ifndef HOVEREVENTFILTER_H
#define HOVEREVENTFILTER_H
#include <QObject>
#include <QEvent>
class HoverEventFilter : public QObject
{
Q_OBJECT
public:
explicit HoverEventFilter(QObject *parent = 0);
signals:
void HoverIn(QObject *);
void HoverOut(QObject *);
public slots:
protected:
bool eventFilter(QObject *watched, QEvent *event);
};
#endif // HOVEREVENTFILTER_H
hovereventfilter.cpp
#include "hovereventfilter.h"
HoverEventFilter::HoverEventFilter(QObject *parent) : QObject(parent)
{
}
bool HoverEventFilter::eventFilter(QObject *watched, QEvent *event)
{
QEvent::Type t = event->type();
switch(t){
case QEvent::Enter:
emit HoverIn(watched);
break;
case QEvent::Leave:
emit HoverOut(watched);
break;
default:
return false;
}
return true;
}
Вы можете видеть, что этот класс будет запускать HoverIn или HoverOut в зависимости от того, что произошло. Этот подход не требует настроек Qt::WA_Hover
Теперь, как последний шаг, нам нужно указать, какие элементы должны быть отфильтрованы, и соединить сигналы и слоты. Я создам приватный указатель на фильтр событий в mainwindow.h
class MainWindow : public QWidget
{
Q_OBJECT
...
public slots:
void onHoverIn(QObject* object);
void onHoverOut(QObject* object);
private:
HoverEventFilter* hoverEventFilter;
...
};
И в конструкторе я добавляю это:
this->hoverEventFilter = new HoverEventFilter(this);
connect(this->hoverEventFilter, SIGNAL(HoverIn(QObject*)), this, SLOT(onHoverIn(QObject*)));
connect(this->hoverEventFilter, SIGNAL(HoverOut(QObject*)), this, SLOT(onHoverOut(QObject*)));
Теперь, когда я хочу получать всплывающие события для какого-либо объекта, я просто устанавливаю на него фильтр событий, например:
this->ui->someLabelOrWhatever->installEventFilter(this->hoverEventFilter);
Осталось реализовать onHoverIn
и onHoverOut
в MainWindow
. Они оба разделяют одну и ту же идею, поэтому я покажу только onHoverIn
void MainWindow::onHoverIn(QObject *object)
{
QString objectName = object->objectName();
switch(objectName){
// do something depending on name of the widget
}
}
Вы можете легко расширить это, чтобы обрабатывать всплывающие события для нового элемента, просто установите прослушиватель событий на него и позаботьтесь о том, что вы хотите сделать в методах onHoverIn
и onHoverOut
. Нет необходимости создавать подклассы для каких-либо виджетов.