[英]Emit event of an object before eventFilter trigers
我想向一個對象添加一個事件。 因此我創建了一個實現 eventFilter 的類。
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QVBoxLayout>
#include "eventwatcher.cpp"
#include "mynewlineedit.cpp"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QVBoxLayout *mainLay = new QVBoxLayout();
MyNewLineEdit *lineEdit;
for(int i = 0; i < 3; i++)
{
lineEdit = new MyNewLineEdit();
mainLay->addWidget(lineEdit);
new EventWatcher(lineEdit);
}
QWidget *centWid = new QWidget();
centWid->setLayout(mainLay);
setCentralWidget(centWid);
}
MainWindow::~MainWindow()
{
delete ui;
}
事件觀察者.cpp:
#include <QWidget>
#include <QDebug>
#include <QKeyEvent>
#include <iostream>
class EventWatcher : public QObject
{
public:
explicit EventWatcher(QWidget* parent = Q_NULLPTR) : QObject(parent)
{
if (parent)
{
parent->installEventFilter(this);
}
}
virtual bool eventFilter(QObject*, QEvent* event) Q_DECL_OVERRIDE
{
if (event->type() == QEvent::KeyPress)
{
std::cout << "Pressed any key\n";
}
return false;
}
};
mynewlineedit.cpp
#include <QLineEdit>
#include <iostream>
class MyNewLineEdit : public QLineEdit
{
public:
MyNewLineEdit() : QLineEdit()
{}
protected:
void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE
{
std::cout << "Event of the parent object\n";
}
};
將CONFIG += console
添加到 .pro 文件
該項目是一個普通的 Qt-Widgets-Application 所有其他文件都沒有修改。
結果如下:
按任意鍵
父對象的事件
它自己的 eventFilter 工作正常。 但是事件處理的順序有問題。
eventFilter 在觸發父對象的 KeyPressEvent 之前執行。 但對我來說,重要的是事件 Filter 在父對象的 KeyPressEvent 之后觸發。
我想得到的結果如下:
父對象的事件
按任意鍵
有沒有辦法定義執行順序?
這是我想出的解決方案:
#include <QWidget>
#include <QDebug>
#include <QKeyEvent>
#include <iostream>
#include <mynewlineedit.h>
class EventWatcher : public QObject
{
QWidget* m_parent;
public:
explicit EventWatcher(QWidget* parent = Q_NULLPTR) : QObject(parent), m_parent(parent)
{
if (parent)
{
parent->installEventFilter(this);
}
}
virtual bool eventFilter(QObject*, QEvent* event) Q_DECL_OVERRIDE
{
if (event->type() == QEvent::KeyPress)
{
if(m_parent)
{
dynamic_cast<MyNewLineEdit*>(m_parent)->keyPressEvent(dynamic_cast<QKeyEvent*>(event));
}
std::cerr << "Pressed any key\n";
return true;
}
return false;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.