使QDialog模态到操作系统

时间:2016-01-05 20:01:11

标签: c++ qt user-interface modal-dialog

如果QDialog实例是exec(),是否可能阻止整个操作系统,直到用户关闭对话框为止?在下面的最小示例中,对话框仅阻止其父窗口小部件,但不阻止Qt应用程序之外的OS元素。

rootwindow.h

#ifndef ROOTWINDOW_H
#define ROOTWINDOW_H

#include <QApplication>
#include <QMainWindow>
#include <QtDebug>
#include <QDialog>
#include <QPushButton>
#include <QMessageBox>
#include <QBoxLayout>

class RootWindow : public QMainWindow
{
    Q_OBJECT

private:

    QWidget *widgetCentral;
    QBoxLayout *layoutMain;
    QPushButton *button;
    QDialog *dialog;

public:

    RootWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0);
    ~RootWindow();

private slots:

    void slotClicked();
};

#endif // ROOTWINDOW_H

rootwindow.cpp

#include "rootwindow.h"

RootWindow::RootWindow(QWidget *parent, Qt::WindowFlags flags): QMainWindow(parent, flags)
{
    setCentralWidget( widgetCentral = new QWidget );
    widgetCentral->setLayout( layoutMain = new QBoxLayout(QBoxLayout::LeftToRight) );
    layoutMain->addWidget(button = new QPushButton("Click me"));

    dialog = new QDialog(this);
    dialog->setModal(true);
    dialog->setWindowModality(Qt::ApplicationModal);

    connect(button, &QPushButton::clicked, this, &RootWindow::slotClicked);
}

RootWindow::~RootWindow()
{

}

void RootWindow::slotClicked()
{
    int i = dialog->exec();
    qDebug() << "Dialog result: " << i;
}

的main.cpp

#include "rootwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    RootWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:3)

简答:你做不到。可能有一种使用本机API的方法,但我对此表示怀疑。

但是,有一种方法可以归档类似的行为:显示不透明度为1%的无框全屏窗口 - 此窗口对用户不可见,但会阻止所有鼠标输入。然后在该窗口顶部显示一个普通对话框。

请注意,此方法仅是一种解决方法,不适用于多个桌面。除此之外,一些应用程序(如任务管理器)仍将保持在您的窗口之上。键盘快捷键如 Alt + Tab ,windows-key等等仍然可以正常工作。还有更多...

最后但同样重要的是:即使你可以,也不应该。阻止整个计算机对您的应用程序来说是一种不良行为。显示正常的应用程序模式对话框应该足够了!如果用户不想关注你的程序,你不应该强迫他!