2016-01-05 12 views
0

如果某個QDialog實例是exec()未使用,是否可能會阻止整個操作系統,直到用戶關閉對話框?在下面的最小例子中,對話框僅阻止其父窗口小部件,但不阻止Qt應用程序之外的操作系統元素。將QDialog模式設置爲操作系統

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(); 
} 
+3

Afaik這是不可能的Qt – Evgeny

+0

還沒有與其他框架;-) –

+1

...這是一件好事。 –

回答

2

簡短的回答:不能。可能有一種使用本地API的方式,但我對此表示懷疑。

但是,您可以存檔類似的行爲:顯示1%不透明度的無框全屏窗口 - 此窗口對用戶不可見,但會阻止所有鼠標輸入。然後在該窗口頂部顯示一個正常的對話框。

請注意,此方法僅僅是一種解決方法,不適用於多個桌面。除此之外,一些應用程序(如任務管理器)仍將保留在窗口之上。鍵盤shortcust像替代 + 標籤,Windows鍵和其他將仍然正常工作。更多...

最後但並非最不重要的:即使你可以,你不應該。阻止整個計算機對於您的應用程序來說是不好的行爲。顯示正常的應用程序模式對話框應該足夠了!如果用戶不想關注你的程序,你不應該強迫他!

相關問題