1. イベント配信命令(テスト)
- QPushButton を継承してボタン クラス XPushButton をカスタマイズします
- ボタン コントロール XPushButton * btn を親ウィンドウ MainWindow に追加します。
- 次の 2 つの関数を MainWindow と XPushButton にそれぞれオーバーロードします。
// 1. 如果不重载以下两个函数,则点击事件不会由子窗口传递给父窗口
// 2. 重载以下两个窗口的情况下,具体的事件传递得看 event() 的返回值
// 2.1 event() 返回默认值:QPushButton::event(ev); 也就是默认处理方式
// 如果重载了 mousePressEvent() ,说明控件有自己的处理方法,则事件传递给 mousePressEvent
// 如果没有重载 mousePressEvent() ,默认事件已处理,不继续传递
// 2.2 event() 手动返回 true 也就是手动确认事件已处理,不论有没有重载 mousePressEvent,
// 事件都不会往下传递,mousePressEvent() 不会执行
// 2.3 event() 手动返回 false 也就是认为事件未处理,不论有没有重载 mousePressEvent,
// 事件都会直接返回上一级的 event(), 即 MainWindow::event(QEvent *ev)
// XPushButton
bool XPushButton::event(QEvent * ev)
{
if (ev->type() == QEvent::MouseButtonPress)
{
qDebug()<< "XPushButton event()";
return false; // 标记 B行
}
return QPushButton::event(ev);
}
void XPushButton::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
qDebug()<< "XPushButton mousePressEvent()";
}
}
// 2.4 事件 在 MainWindow::event(QEvent *ev) 中的传递流程与上述相同,也取决于 event 的返回值
// 和 是否重载了 mousePressEvent
// MainWindow
bool MainWindow::event(QEvent *ev)
{
if (ev->type() == QEvent::MouseButtonPress)
{
qDebug()<< "MainWindow event()";
return false; // 标记 A行
}
return QMainWindow::event(ev);
}
void MainWindow::mousePressEvent(QMouseEvent *ev)
{
qDebug()<< "MainWindow mousePressEvent()";
}
2. イベントフィルターを追加する
次の 2 つの手順を追加した後、サブスペースのイベントはまず MainWindow::eventFilter() を通過し、次に上記のプロセスを再度通過します。
- 1. このボタンのイベント リスナーをインストールします。
btn->installEventFilter(父窗口指针);
- 2. 親ウィンドウのイベント フィルター イベントをオーバーロードします。
bool MainWindow::eventFilter(QObject * target, QEvent * ev)
{
if (ev->type() == QEvent::MouseButtonPress)
qDebug()<< "Parent eventFilter: button pressed";
return QWidget::eventFilter(target, ev);
}
3. 特殊イベントハンドラ関数の起動方法
- キーボードタイムファイア
// 1. 设置窗口属性
setFocusPolicy(Qt::StrongFocus);
// 2. 重载事件处理函数
void keyPressEvent(QKeyEvent *event) override;