【问题标题】:How to avoid bringing QMainWindow to the front when clicking on independent QWidget点击独立QWidget时如何避免将QMainWindow拉到最前面
【发布时间】:2021-01-19 08:23:38
【问题描述】:

我正在开发 Qt 应用程序。我有 QMainWindow 和 QWidget,它们独立显示在窗口外。

我想实现,如果我点击那个 QWidget,窗口就不会出现在前面。即如果它在另一个应用程序后面,它应该保持这样。

我已经创建了测试应用:

main.cpp

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   MainWindow w;
   w.show();
   Widget mywidget;
   return app.exec();
}

Widget.cpp
namespace
{
 Qt::WindowFlags defaultWindowFlags()
 {
  Qt::WindowFlags f = 0;

  f |= Qt::X11BypassWindowManagerHint;
  f |= Qt::FramelessWindowHint;
  f |= Qt::WindowStaysOnTopHint;
  f |= Qt::CustomizeWindowHint;
  f |= Qt::WindowDoesNotAcceptFocus;  
  f |= Qt::Window;
 return f;
 }
}

Widget::Widget(QWidget *parent) : QWidget(parent, defaultWindowFlags())
{
 setFixedSize(100,100);
 setStyleSheet("background-color:blue;");
 move(56,89);
 setVisible(true);
}

【问题讨论】:

  • 我想实现,如果我点击那个 QWidget,窗口就不会出现在最前面。 我知道某些 X11 窗口管理器会这样做—— the-box(或者可以配置为这样做)。我们在 Windows 上遇到过类似的事情,最后放弃了。在 Windows 中管理堆栈(使用纯 Qt 解决方案)对我来说似乎是一个难题。要在您的问题上取得进展,edit 并提及您的目标平台可能会有所帮助。
  • 我刚刚制作了一个 MCVE 并在 Windows 上进行了测试。一个瞬态的QDialog(以主要胜利为父)总是在主要胜利之上。并带来了主要的胜利。单击时到前面。非瞬态QDialog(没有父窗口)是一个独立窗口。单击它会将其置于顶部,而不会更改主要胜利的当前堆叠级别。我看到你也构造了Widget mywidget; 没有父窗口。所以,你可能不在 Windows 上(它应该在哪里工作)。 (f |= Qt::X11BypassWindowManagerHint; 让我更加相信这一点。)我想这可能与您的特定窗口管理器有关...
  • @Scheff 对不起,我忘了提。我在 MacOS 平台上
  • 当您单击小部件时,我无法重现出现在顶部的 MainWindow。只有关闭小部件才能将 MainWindow 带到顶部。 (Mac OS 10.15.7, Qt 5.15.0)
  • @Jens 你能分享你正在使用的代码吗?我已经使用 Qt 5.15.0 和 MacOS Catalina 10.15.7 进行了尝试,当我单击小部件时,QMainWindow 出现在前面。我想将您的代码与我的代码进行比较,看看有什么不同

标签: macos qt qt5 qwidget qmainwindow


【解决方案1】:

省略f |= Qt::WindowDoesNotAcceptFocus;这行,这使得Qt将焦点保持在主窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多