在 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键并忽略它?
您可以使用 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);
}