gpt4 book ai didi

c++ - 在eventFilter触发之前发出对象的事件

转载 作者:行者123 更新时间:2023-12-02 10:21:48 27 4
gpt4 key购买 nike

我想向对象添加事件。因此,我创建了一个实现eventFilter的类。

最小示例:

主窗口

#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-Application,其他所有文件均未修改。

结果如下:

Pressed any key

Event of the parent object



它本身的eventFilter可以正常工作。但是事件处理的顺序存在问题。

在触发父对象的KeyPressEvent之前执行eventFilter。但是对我来说,重要的是,事件过滤器在父对象的KeyPressEvent之后触发。

我想要得到的结果如下:

Event of the parent object

Pressed any key



有什么方法可以定义执行顺序?

最佳答案

这是我想出的解决方案:

  • 将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;
    }
    };

    关于c++ - 在eventFilter触发之前发出对象的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59860119/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com