繁体   English   中英

使QDialog模态到操作系统

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM