如果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();
}
答案 0 :(得分:3)
简答:你做不到。可能有一种使用本机API的方法,但我对此表示怀疑。
但是,有一种方法可以归档类似的行为:显示不透明度为1%的无框全屏窗口 - 此窗口对用户不可见,但会阻止所有鼠标输入。然后在该窗口顶部显示一个普通对话框。
请注意,此方法仅是一种解决方法,不适用于多个桌面。除此之外,一些应用程序(如任务管理器)仍将保持在您的窗口之上。键盘快捷键如 Alt + Tab ,windows-key等等仍然可以正常工作。还有更多...
最后但同样重要的是:即使你可以,也不应该。阻止整个计算机对您的应用程序来说是一种不良行为。显示正常的应用程序模式对话框应该足够了!如果用户不想关注你的程序,你不应该强迫他!