まず、仮想関数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()
に呼び出されるため、ウィジェットが認識する前にアクションを実行できます。内で、イベントを除外する (つまり、ウィジェットにイベントを処理させたくない) 場合は return を、そうでない場合は return を返します。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
}