Выдать событие объекта перед триггерами eventFilter - PullRequest
1 голос
/ 22 января 2020

Я хочу добавить событие к объекту. Поэтому я создал класс, который реализует 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 родительского объекта.

Результат, который я хочу получить, следующий:

Событие родительский объект

нажата любая клавиша

Есть ли способ определить порядок выполнения?

1 Ответ

1 голос
/ 22 января 2020

Вот решение, которое я придумала:

  • Переименуйте свой mynewlineedit. cpp в mynewlineedit.h, измените везде
  • И измените Eventwatcher. cpp к этому:

#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;
   }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...