首先,创建一个简单的子类,QFrame
它重新实现了eventFilter(QObject*, QEvent*)
虚函数:
class MyFrame : public QFrame {
Q_OBJECT
public:
MyFrame(QWidget *parent = 0, Qt::WindowFlags f = 0);
~MyFrame();
virtual bool eventFilter(QObject *watched, QEvent *event);
};
使用MyFrame
而不是QFrame
包含您的小部件。然后,在代码中创建包含在 中的小部件的某处,MyFrame
在这些小部件上安装事件过滤器:
// ...
m_myFrame = new MyFrame(parentWidget);
QVBoxLayout *layout = new QVBoxLayout(myFrame);
m_button = new QPushButton("Widget 1", myFrame);
layout->addWidget(m_button);
m_button->installEventFilter(myFrame);
//...
此时,MyFrame::eventFilter()
将在任何事件传递给小部件之前调用,让您在小部件意识到之前对其进行操作。在 内MyFrame::eventFilter()
,true
如果您想过滤掉事件(即您不希望小部件处理事件),则返回,false
否则返回。
bool MyFrame::eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_button) { // An event occured on m_button
switch (event -> type()) {
case QEvent::FocusIn:
// Change the stylesheet of the frame
break;
case QEvent::FocusOut:
// Change the stylesheet back
break;
default:
break;
}
}
return false; // We always want the event to propagate, so always return false
}