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

时间:2013-12-17 08:53:16

标签: qt

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

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

我尝试使用 “setWindowFlags(Qt :: WindowStaysOnTopHint);” ,但它使QWidget保持在所有应用程序之上。

3 个答案:

答案 0 :(得分:7)

使用SetWindowModality代替WindowStayOnTopHint,modal modes(Qt :: WindowModal和Qt :: ApplicationModal)允许其他应用程序位于模态窗口之上。

LE:您可以在QDialog的文档页面here

中详细了解 ApplicationModal WindowModal 之间的区别

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();
}

答案 1 :(得分:0)

我已经在Qt 5.3.0中使用和工作

setWindowFlags(Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint| Qt::Window);

Qt :: Tool也可以用来代替QWindow
在调用之前也设置Parent。它会很好地工作

答案 2 :(得分:0)

这对我有用:

我有一个非模态QDialog,我想留在我的应用程序前面,但只有我的应用程序。 在显示对话框之前,我将应用程序的QMainWindow设置为其父级:

foreach( QWidget* p_widget, qApp->topLevelWidgets() )
{
    if ( QMainWindow* p_main_window = qobject_cast<QMainWindow*>( p_widget ) )
    {
        m_p_settings_dialog->setParent( p_main_window );
    }
}

然后我设置了标志:

m_p_settings_dialog->setWindowFlags( Qt::Window
                                     | Qt::CustomizeWindowHint
                                     | Qt::WindowTitleHint
                                     | Qt::WindowCloseButtonHint );

然后我会显示对话框。

现在它对我来说完美无瑕。根本不需要设置Qt :: WindowStaysOnTopFlag。 祝你好运!