[英]Make QDialog modal to operating system
如果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();
}
簡答:你不能。 可能有使用本機API的方法,但我對此表示懷疑。
但是,有一種方法可以歸檔類似的行為:顯示不透明度為1%的無框全屏窗口 - 此窗口對用戶不可見,但會阻止所有鼠標輸入。 然后在該窗口的頂部顯示一個普通對話框。
請注意,此方法僅是一種解決方法,不適用於多個桌面。 除此之外,一些應用程序(如任務管理器)仍將保持在您的窗口之上。 鍵盤快捷鍵如Alt + Tab ,windows-key和其他鍵仍然可以正常工作。 和更多...
最后但同樣重要的是:即使你可以,也不應該。 阻止整個計算機對您的應用程序來說是一種不良行為。 顯示正常的應用程序模式對話框應該足夠了! 如果用戶不想關注你的程序,你不應該強迫他!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.