c – Qt:当主窗口被模态QDialog阻塞时,如何关注从主窗口创建的
发布时间:2020-12-16 09:50:20 所属栏目:百科 来源:网络整理
导读:在我的Qt应用程序中,我面临以下情况: 当一个特定的事件被提出时,我会显示一个无模式的QDialog,它会要求用户进行确认. 使用QMainWindow中的show()函数显示对话框. 无论何时引发事件并且未显示其他模态QDialog,用户都可以单击确认按钮. 不幸的是,如果在引发事
在我的Qt应用程序中,我面临以下情况:
当一个特定的事件被提出时,我会显示一个无模式的QDialog,它会要求用户进行确认. 使用QMainWindow中的show()函数显示对话框. 无论何时引发事件并且未显示其他模态QDialog,用户都可以单击确认按钮. 不幸的是,如果在引发事件时可以看到模态QDialog,则无法访问无模式QDialog.这意味着用户无法单击确认按钮. 以下代码是导致相同问题的简化版本 在这个例子中,QMainWindow包含一个按钮,当单击按钮时,使用exec()函数显示模态QDialog,同时启动了QTimer. 无论何时我在QTimer经过之前关闭模态QDialog,都可以访问无模式对话框.如果我等到显示无模式对话框而没有关闭模态对话框,则无法访问无模式对话框(我需要先关闭模态对话框). MainWindows代码: #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); m_pModeless = new DialogModal(this); connect(&m_qTimer,SIGNAL(timeout()),this,SLOT(TimerElapsed())); } MainWindow::~MainWindow() { delete m_pModeless; delete ui; } void MainWindow::TimerElapsed() { m_qTimer.stop(); m_pModeless->show(); m_pModeless->activateWindow(); m_pModeless->raise(); m_pModeless->setFocus(); } void MainWindow::on_pbStartTest_clicked() { m_qTimer.start(10000); DialogModal d(this); d.exec(); } MainWindow标题: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> #include "dialogmodal.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QTimer m_qTimer; DialogModal *m_pModeless; private: Ui::MainWindow *ui; private slots: void TimerElapsed(); void on_pbStartTest_clicked(); }; #endif // MAINWINDOW_H DialogModal标题: #ifndef DIALOGMODAL_H #define DIALOGMODAL_H #include <QDialog> namespace Ui { class DialogModal; } class DialogModal : public QDialog { Q_OBJECT public: explicit DialogModal(QWidget *parent = 0); ~DialogModal(); private slots: void on_pbExit_clicked(); private: Ui::DialogModal *ui; }; #endif // DIALOGMODAL_H DialogModal来源: #include "dialogmodal.h" #include "ui_dialogmodal.h" DialogModal::DialogModal(QWidget *parent) : QDialog(parent),ui(new Ui::DialogModal) { ui->setupUi(this); } DialogModal::~DialogModal() { delete ui; } void DialogModal::on_pbExit_clicked() { close(); } 无论如何,即使存在一个或多个模态对话框,还是要关注无模式对话框? 解决方法
我找到了一个有效的解决方
void MainWindow::TimerElapsed() { QWidget *pwidget=NULL; m_qTimer.stop(); foreach(pwidget,QApplication::topLevelWidgets()) { if ((pwidget->isWindow())&&(pwidget->isModal())) { m_pModeless->setParent(pwidget); } } if (pwidget==NULL) { m_pModeless->setParent(this); } m_pModeless->show(); m_pModeless->activateWindow(); m_pModeless->raise(); m_pModeless->setFocus(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |