簡體   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