如何通过按Esc键使非模态QDialog不可取消
How to make non-modal QDialog not cancellable by pressing Esc key?
当用户点击Esc
时,除了重写reject()
或使用事件过滤器/event
方法之外,我还能阻止非模态QDialog关闭吗?如果没有,是否可以使用模态QDialog?
如果不想使用eventFilter,可以使用QShortcut为Escape创建键盘快捷键,并调用对话框的显示槽。可以这样做:
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
QShortcut * shortcut = new QShortcut(QKeySequence(Qt::Key_Escape),this,SLOT(show()));
shortcut->setAutoRepeat(false);
}
您可以覆盖对话框中的eventFilter,并在按下Escape时自行管理:
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
this->installEventFilter(this);
}
bool MyDialog::eventFilter(QObject *obj, QEvent * event)
{
if((MyDialog *)obj == this && event->type()==QEvent::KeyPress && ((QKeyEvent*)event)->key() == Qt::Key_Escape )
{
return true;
}
return false;
}
创建一个基于QObject的类来接收事件:-
class MyEvents : public QObject
{
Q_OBJECT
public:
MyEvents(QObject* parent);
protected:
bool eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Escape)
return true;
else
return QObject::eventFilter(obj, event);
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
};
然后安装对象作为对话框的事件过滤器
MyEvents* myEvents = new MyEvents;
QDialog myDialog(parent);
myDialog->installEventFilter(myEvents);
相关文章:
- 如何在QT中制作模态QProgressDialog?
- 如何让 QInputDialog 更少模态?
- cdhtmldialog-使其模态
- Qt - 创建主窗口前的非模态对话框
- 如何正确使用异常处理IWTH模态对话框
- 如何使用Ifileopendialog打开 *模态 *文件对话框
- 模态qprogressdialog :: setValue()导致嵌套事件循环崩溃
- 捕获新创建的模态对话框的窗口句柄
- 模态形式之上的主形式
- QT在菜单项上显示模态对话框(.UI)单击
- 如何将QMainWindow设置为模态
- Qt中的多模态窗口
- 正在从Script/osx 10.7+/safari/automatior/objective-c中删除模态
- 自动对焦QLineEdit在QDialog与弹出标志和模态在主窗口
- VC6中的多模态对话框
- 当用户尝试激活主窗口时引发模态QDialog
- 如何使非模态对话框始终在应用程序的顶部
- 非模态对话框窗口的良好设计是什么?
- 从通过模态WinForms调用的C++调用IConnectionPointImpl接口时出现问题
- 如何通过按Esc键使非模态QDialog不可取消