簡體   English   中英

在 eventFilter 觸發之前發出對象的事件

[英]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 之后觸發。

我想得到的結果如下:

父對象的事件

按任意鍵

有沒有辦法定義執行順序?

這是我想出的解決方案:

  • 將您的 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;
   }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM