【问题标题】:Qt Window flags set to Qt::WindowStaysOnTopHint but not workingQt Window 标志设置为 Qt::WindowStaysOnTopHint 但不工作
【发布时间】:2019-05-16 14:21:59
【问题描述】:

我创建了一个“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();
    }

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

【问题讨论】:

  • 您考虑过使用QSplashScreen吗?
  • @TrebledJ,可能有,但我最初是在前一段时间写的,它完全符合我的要求和需要,除了保持领先......这应该是可能的给定标志的名称。跨度>
  • 你在它前面拖什么窗口?你创建的一个?您使用什么标志来创建另一个窗口?前面是否显示其他应用程序窗口?
  • @Nick,我希望我的应用程序创建的所有窗口都出现在启动画面后面。所有窗口的窗口都使用默认值,除了我发布的启动画面。
  • 这个窗口可能不是问题,这就是我所得到的。你能显示正在创建的其他窗口的代码吗?

标签: c++ qt always-on-top


【解决方案1】:

以下程序对我有用;对你起作用吗? (在我的 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 进行测试)

【讨论】:

  • 不一样,在同一个应用程序中创建另一个窗口,然后确保第二个窗口不出现也不能出现在原来的前面。
  • 好的,完成。请参阅更新的文本。随意提出您自己的程序来演示错误;如果人们可以编写一个程序并自己观察故障,那么他们就可以对问题进行试验并找出入口条件,而不必仅仅猜测可能出了什么问题。
  • 谢谢您,您的代码可以正常工作,我真的不确定问题出在哪里...现在正在调查。
  • 我想我可以看到我的问题出在哪里,但我不确定它为什么会起作用。在我的主窗口中,我创建了一个新的小部件,然后将其视为一个窗口,这就是问题所在,如果您修改代码而不是另一个 QMainWindow,请使用“QWidget* pobjWin = new QWidget();”然后使用与主窗口相同的方法,最后调用 show....这个新小部件不遵守窗口规则。
  • 刚刚改例程使用QMainWindow代替QWidget,还是一样的问题...
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2016-04-14
相关资源
最近更新 更多