首页 > 解决方案 > Qt Window 标志设置为 Qt::WindowStaysOnTopHint 但不工作

问题描述

我创建了一个“flash”窗口以在应用程序启动期间显示图像。显示图像,在派生的 QMainWindow 构造函数中设置标志:

setWindowFlags(Qt::CustomizeWindowHint
             | Qt::FramelessWindowHint                   
             | Qt::WindowStaysOnTopHint);

但是,当创建另一个窗口时,我可以将这个新窗口拖到我不想要的启动窗口前面。我希望拖动的窗口位于启动窗口的后面,直到它被删除。

我在网上搜索,我设置的应该可以工作,但它没有。我正在使用基于 Qt 5.12.2 的 Qt Creator 4.9.0

我的系统是 iMAC(Retina 5K,27 英寸,2015 年末)。

[编辑] 我使用下面的代码来测试并证明我遇到的错误,我的应用程序窗口需要是模态的,但我希望启动窗口始终位于顶部。

    #include <QMainWindow>
    #include <QApplication>

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

       QMainWindow * mw = new QMainWindow();
       mw->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
       mw->resize(500, 500);
       mw->show();

       QMainWindow * secondWindow = new QMainWindow();
       secondWindow->setWindowModality(Qt::ApplicationModal); // <- This breaks the always on top flag
       secondWindow->resize(500, 500);
       secondWindow->show();
       return app.exec();
    }

我尝试将两个窗口都设置为模态,但这也无济于事。

标签: c++qtalways-on-top

解决方案


以下程序对我有用;对你起作用吗?(在我的 Mac 上,运行此程序会打开一个始终位于所有其他窗口前面的空灰色窗口)

#include <QMainWindow>
#include <QApplication>

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

   QMainWindow * mw = new QMainWindow;
   mw->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
   mw->resize(500, 500);
   mw->show();

   QMainWindow * secondWindow = new QMainWindow;
   secondWindow->resize(500, 500);
   secondWindow->show();
   return app.exec();
}

如果这个程序对你有用,那么你需要弄清楚你自己的程序与这个程序有何不同;OTOH,如果此程序显示与您在自己的程序中看到的相同的错误行为,那么您使用的 Qt 版本可能存在错误。(我在运行 OS/X 10.14.4、FWIW 的 2018 Mac mini 上使用 Qt 5.12.2 进行测试)


推荐阅读