gpt4 book ai didi

c++ - 我的 Qt eventFilter() 没有按预期停止事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:10 26 4
gpt4 key购买 nike

我的事件过滤器存在根本性错误,因为它让每个 单个事件通过,而我想停止一切。我已经阅读了很多关于 QEventeventFilter() 等的文档,但显然我遗漏了一些重要的东西。本质上,我正在尝试基于 QDialog 为我的弹出窗口类创建我自己的模态功能。我想实现我自己的,因为内置的 setModal(true) 包含很多功能,例如正在播放我想排除的 QApplication::Beep()基本上,我想丢弃所有转到创建弹出窗口的 QWidget(窗口)的事件。到目前为止,我所拥有的是,

// popupdialog.h
#ifndef POPUPDIALOG_H
#define POPUPDIALOG_H

#include <QDialog>
#include <QString>

namespace Ui {class PopupDialog;}

class PopupDialog : public QDialog
{
Q_OBJECT
public:
explicit PopupDialog(QWidget *window=0, QString messageText="");
~PopupDialog();
private:
Ui::PopupDialog *ui;
QString messageText;
QWidget window; // the window that caused/created the popup
void mouseReleaseEvent(QMouseEvent*); // popup closes when clicked on
bool eventFilter(QObject *, QEvent*);
};

...

// popupdialog.cpp
#include "popupdialog.h"
#include "ui_popupdialog.h"

PopupDialog::PopupDialog(QWidget *window, QString messageText) :
QDialog(NULL), // parentless
ui(new Ui::PopupDialog),
messageText(messageText),
window(window)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose, true); // Prevents memory leak
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
ui->message_text_display->setText(messageText);

window->installEventFilter(this);

//this->installEventFilter(window); // tried this also, just to be sure ..
}

PopupDialog::~PopupDialog()
{
window->removeEventFilter(this);
delete ui;
}

// popup closes when clicked on
void PopupDialog::mouseReleaseEvent(QMouseEvent *e)
{
close();
}

问题来了,过滤器不起作用。请注意,如果我写一个 std::coutif(...) 中,我看到它确实会在事件发送到 window 时触发,只是不会阻止它们。

bool PopupDialog::eventFilter(QObject *obj, QEvent *e)
{
if( obj == window )
return true; //should discard the signal (?)
else
return false; // I tried setting this to 'true' also without success
}

当用户与主程序交互时,可以像这样创建一个 PopupDialog:

PopupDialog *popup_msg = new PopupDialog(ptr_to_source_window, "some text message");
popup_msg->show();
// I understand that naming the source 'window' might be a little confusing.
// I apologise for that. The source can in fact be any 'QWidget'.

其他一切都按预期工作。只有事件过滤器失败。 我希望过滤器删除发送到创建弹出窗口的窗口的事件;像鼠标点击和按键,直到弹出窗口关闭。当有人指出我的代码中的一个微不足道的修复时,我会感到非常尴尬。

最佳答案

您必须忽略到达窗口 的小部件树中的所有事件。因此,您需要在整个应用程序范围内安装 eventFilter 并检查您过滤的对象是否是 window 的后代。换句话说:替换

window->installEventFilter(this);

通过

QCoreApplication::instance()->installEventFilter(this);

并以这种方式实现事件过滤器功能:

bool PopupDialog::eventFilter(QObject *obj, QEvent *e)
{
if ( !dynamic_cast<QInputEvent*>( event ) )
return false;

while ( obj != NULL )
{
if( obj == window )
return true;
obj = obj->parent();
}
return false;
}

我试过了,测试了它,它对我有用。

注意:根据我的经验,在 Qt 中使用事件过滤器有点困惑,因为它不是很清楚正在发生的事情。预计错误会不时弹出。如果您和您的客户对灰显主窗口没有任何问题,您可以考虑禁用主窗口。

关于c++ - 我的 Qt eventFilter() 没有按预期停止事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41631011/

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