禁用 esc 键关闭 QDialog

问题描述 投票:0回答:1

在 Windows Visual Studio 代码中的 C++ 中,我使用 QDialog 来显示一些信息。

void signalWidget::ShowSignalInformation()
{
    QDialog *pcDialog = new QDialog();
    QGridLayout* layout = new QGridLayout(this);

    QString signalName = m_signal.family();
    QLabel* pclblsignalName = new QLabel("Local signal Name");
    QLineEdit* pcsignalName = new QLineEdit(signalName);
    pcsignalName->setEnabled(false);

    .
    .
    .
    .

    layout->addWidget(pclblsignalName , 0, 0, 1, 12);
    layout->addWidget(pcsignalName, 0, 14, 1, 12);


    pcDialog->setLayout(layout);

    if (pcDialog->exec() != QDialog::Accepted)
        return;
}

但我不希望 ESC 键关闭或隐藏 QDialog。 如何处理ESC键并忽略它?

c++ qt qdialog
1个回答
0
投票

您可以使用 QObject::installEventFilter 在对话框上安装事件过滤器,并通过覆盖过滤器对象中的 QObject::eventFilter 来处理过滤器对象中的事件。

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDialog>
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    bool eventFilter(QObject *watched, QEvent *event) override;

private:
    QDialog test_dialog{this};
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"

#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    test_dialog.installEventFilter(this);
    test_dialog.exec();
}

MainWindow::~MainWindow()
{
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (watched != &test_dialog || event->type() != QEvent::KeyPress)
        return QMainWindow::eventFilter(watched, event);

    QKeyEvent *key_event = dynamic_cast<QKeyEvent*>(event);
    if (key_event == nullptr)
        return QMainWindow::eventFilter(watched, event);

    if (key_event->key() == Qt::Key_Escape)
        return true; // stop handling further

    return QMainWindow::eventFilter(watched, event);
}
© www.soinside.com 2019 - 2024. All rights reserved.