Я хочу добавить событие к объекту. Поэтому я создал класс, который реализует 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;
}
eventwatcher. 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 -Применение всех остальных файлов не изменяется.
Результат следующий:
Нажатие любой клавиши
Событие родительского объекта
EventFilter сам по себе работает нормально. Но есть проблема с порядком обработки событий.
EventFilter выполняется до того, как KeyPressEvent родительского объекта запущен. Но для меня важно, чтобы фильтр событий срабатывал после KeyPressEvent родительского объекта.
Результат, который я хочу получить, следующий:
Событие родительский объект
нажата любая клавиша
Есть ли способ определить порядок выполнения?