QMainWindow的形态。为什么Qt :: WindowModal不像我想的那样工作?

时间:2012-02-21 23:45:27

标签: qt user-interface qt4 qwidget qmainwindow

我在使用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种方式,而其他两种方式看起来并不像我需要的那样。

1 个答案:

答案 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 * m1Dialog * m2Dialog * m3窗口没有闪烁(效果闪烁), 但如果我点击MainWindowDialog * 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()));
    }
}