Rud*_*eri 3 c++ qt modal-dialog modeless qdialog
在我的Qt应用程序中,我面临以下情况:当引发特定事件时,我显示无模式QDialog,要求用户进行确认.使用show()来自a的函数显示对话框QMainWindow.无论何时引发事件并且未显示其他模态QDialog,用户都可以单击确认按钮.不幸的是,如果在QDialog引发事件时可以看到模态,QDialog则无模式是无法访问的.这意味着用户无法单击确认按钮.以下代码是导致相同问题的简化版本在此示例中QMainWindow包含一个按钮,当单击按钮时,QDialog使用该exec()函数显示模态,同时a QTimer已启动.无论何时我QDialog在QTimer经过之前关闭模态,都可以访问无模式对话框.如果我等到显示无模式对话框而没有关闭模态对话框,则无法访问无模式对话框(我需要先关闭模态对话框).
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();
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
无论如何,即使存在一个或多个模态对话框,还是要关注无模式对话框?
我找到了一个有效的解决方
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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6565 次 |
| 最近记录: |