首先,创建的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
}
阿奇,谢谢你的回复。你能给我一个关于如何为此目的扩展QFrame的指针吗? – Elwood
完美。我特别喜欢'hookChildrenWidgetsFocus()'的想法。 (但是我有一点点良心,因为我从Fred取走了接受人,他早先提出了一个类似的方法,非常感谢你们两个!) – Elwood