我在使用Qt窗口并将窗口模态设置为WindowModal时遇到了一些问题,如果有人可以帮我解决这个问题,我真的很感激
我有一个名为A的窗口,它是3个窗口B1,B2和B3的父窗口(它们是同一个类并按顺序生成)。 我期望这三个窗口中的任何一个都会阻挡A,但它们不会相互阻挡。
根据该文件,我可以通过将B1,B2和B3设置为Qt :: WindowModal来实现。 http://developer.qt.nokia.com/doc/qt-4.8/qt.html#WindowModality-enum
然而,结果是全部B1,B2,B3将阻止A,这很好,但B1被B2阻挡,B2被B3阻挡,这不是我所期望的。
它成为一个顺序(A 任何人都可以告诉我问题出在哪里?我使用了错误的方式吗?但是,只有3种方式,而其他两种方式看起来并不像我需要的那样。
答案 0 :(得分:0)
我在" windows7"上进行了测试,遵循以下代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Dialog *m1 = new Dialog(this);
Dialog *m2 = new Dialog(this);
Dialog *m3 = new Dialog(this);
m1->setWindowModality(Qt::WindowModal);
m1->setWindowTitle(tr("Window 1"));
m2->setWindowModality(Qt::WindowModal);
m2->setWindowTitle(tr("Window 2"));
m3->setWindowModality(Qt::WindowModal);
m3->setWindowTitle(tr("Window 3"));
m1->show();
m2->show();
m3->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
可以点击的唯一窗口是Dialog * m3
,另一个窗口被阻止,但是当您点击MainWindow
时,您可能会注意到效果不同。
如果您点击Dialog * m1
或Dialog * m2
到Dialog * m3
窗口没有闪烁(效果闪烁),
但如果我点击MainWindow
到Dialog * m3
窗口将会闪烁(效果闪烁)。
这是类型模式窗口不会阻塞,因为它正在等待响应,
即称之为:
Dialog *m1 = new Dialog(this);
Dialog *m2 = new Dialog(this);
Dialog *m3 = new Dialog(this);
我必须一次确认一个响应,因为它在同步和非同步模式下工作,换句话说,类型模态窗口用于向父窗口发送请求,所以如何很多你没有完成请求所有级联窗口被阻止。换句话说,windows模态(使用" parent" setted)将始终期待响应(例如" exec")。
您可以为" MainWindow窗口创建锁定"使用setEnable (false)
并且当所有对话框关闭到" MainWindow窗口"已启用setEnable (true)
。见例:
注意:如果您将使用模态窗口向父窗口提交回复,则在此示例中您需要使用SLOTS:
accept()
,reject()
或finished(int)
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
public slots:
void showChilds();
void findDialogs(const int a = -1);
};
mainwindow.cpp
#include "dialog.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(showChilds()));
}
void MainWindow::showChilds() {
setEnabled(false);
Dialog *m1 = new Dialog(this);
Dialog *m2 = new Dialog(this);
Dialog *m3 = new Dialog(this);
m1->setAttribute(Qt::WA_DeleteOnClose, true);
m2->setAttribute(Qt::WA_DeleteOnClose, true);
m3->setAttribute(Qt::WA_DeleteOnClose, true);
m1->setWindowTitle("1");
m2->setWindowTitle("2");
m3->setWindowTitle("3");
m1->show();
m2->show();
m3->show();
QObject::connect(m1, SIGNAL(finished(int)), this, SLOT(findDialogs(int)));
QObject::connect(m2, SIGNAL(finished(int)), this, SLOT(findDialogs(int)));
QObject::connect(m3, SIGNAL(finished(int)), this, SLOT(findDialogs(int)));
}
void MainWindow::findDialogs(const int a)
{
if(a==-1){
QObject *tmp;
QObjectList list = this->children();
const int j = list.length();
for(int i=0; i < j; i++) {
tmp = (QObject *) (list.at(i));
if(tmp!=0 && tmp->objectName()=="Dialog") {
return;
}
}
setEnabled(true);
} else {
QTimer::singleShot(1, this, SLOT(findDialogs()));
}
}