将QWidget设置在当前应用程序之上,而不是其他应用程序

Nag*_*ica 9 qt

我有一个带有几个窗口的应用程序.每个窗口都是没有父级的QWidget.

我希望那些QWidget能够应用程序之上,但不能在其他应用程序之上.它就像Visual Studio中的窗口,例如,它们是免费的.它们不能被主窗口隐藏,但可以由其他应用程序隐藏.

我试过"setWindowFlags(Qt :: WindowStaysOnTopHint);" ,但它使QWidget保持在所有应用程序之上.

Zla*_*mir 7

使用SetWindowModality而不是WindowStayOnTopHint,两种模态模式(Qt :: WindowModal和Qt :: ApplicationModal)允许其他应用程序位于模态窗口之上.

LE:您可以在QDialog的文档页面中阅读有关ApplicationModalWindowModal之间差异的更多信息,这里

LE 2:问题是你没有设置父级,所以要解决这个问题,为每个子窗口设置一个父窗口(除了你的主窗口之外的所有东西),一切都会按预期工作(子窗口将位于父,但不会在任何其他应用程序窗口之上):

int main(int argc, char** argv)
{
    QApplication a(argc, argv);

    QWidget w;
    QVBoxLayout* layout = new QVBoxLayout(&w);
    QPushButton* btn = new QPushButton("Show a non-modal window");
    layout->addWidget(btn);
    QWidget* mainWindow = &w;
    QObject::connect(btn, &QPushButton::clicked, [mainWindow]()
        {
            QWidget* dlg = new QWidget(mainWindow);
            QVBoxLayout* dlgLayout = new QVBoxLayout(dlg);
            dlg->setWindowFlags(Qt::Window);
            QLabel* lbl = new QLabel("Non-modal window...", dlg);
            dlgLayout->addWidget(lbl);

            dlg->show();
        });
    w.show();
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

  • setParent 重置窗口标志,请参阅文档:http://qt-project.org/doc/qt-5/qwidget.html#setParent 因此您可以隐藏子窗口小部件,设置父窗口小部件,设置窗口标志,然后显示再次:dlg->hide(); dlg->setParent(mainWindow); dlg->setWindowFlags(Qt::Window); dlg->show(); (2认同)