其他非 qt 窗口顶部的 Qt 小部件

Posted

技术标签:

【中文标题】其他非 qt 窗口顶部的 Qt 小部件【英文标题】:Qt widget on top of other non qt window 【发布时间】:2014-04-04 13:43:03 【问题描述】:

我正在为我在 Windows 操作系统中使用的商业程序(我无法更改它)开发一个插件。在这个插件中,我创建了一个 Qt 小部件,当在主程序中单击一个按钮时,就会出现 qt 小部件。

我的问题是小部件出现在主程序窗口下,而我希望它在它之上。如有必要,它可以始终保持在最前面。

Qt::WindowStaysOnTopHint 似乎在这里不起作用,因为我没有 Qt 父母。

在Qt wiki 之后,我找到了一种将其置于顶部的方法,并且我创建了一个在小部件构造函数之后调用的方法:

void RadiationPatternWidget::setWindowTopMost()

#ifdef Q_WS_WIN32
  HWND hwnd = winId();
  DWORD exStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
  DWORD style   = ::GetWindowLong(hwnd, GWL_STYLE);

  HWND parent = NULL;
  if (parentWidget()) 
    parent = parentWidget()->winId();
  
  exStyle |= WS_EX_TOPMOST;
  HWND newHwnd = ::CreateWindowEx(exStyle, L"#32770", NULL, style,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    parent, NULL, qWinAppInst(), NULL);
  create(newHwnd, true, true);
#endif // Q_WS_WIN32

然后我在构造函数之后调用它:

m_pxRadiationPatternWidget = new RadiationPatternWidget();
m_pxRadiationPatternWidget->setWindowTopMost();

现在它保持在顶部,但我有一些问题:

在小部件内部,我无法使用某些 QPushButton,如果窗口被提升,它们将无法点击。当我用鼠标点击它时,clicked() 信号不会被捕获,按钮图像也不会改变。 在小部件内部,我使用派生的 QGLWidget 派生类。当我把它放在上面时,这个小部件是黑色的,而如果我不调用该方法,它会很好地工作。

我怎样才能正确地在顶部 che QWidget 上加注?

【问题讨论】:

这是什么 Qt 版本? 我使用的Qt版本是4.8.5。 【参考方案1】:

在使用您的 hack 之前,请检查 widget->window()->raise() 是否不起作用。

使用窗口类“#32770”是一个错误。您需要使用 Qt 已经用于您的窗口的相同窗口类。

您需要为现有窗口检索 Qt 使用的类,然后才使用相同的类创建一个新窗口。

【讨论】:

如何检索课程? @Jepessen 阅读 MSDN 中的窗口类。不幸的是,我完全不知道......

以上是关于其他非 qt 窗口顶部的 Qt 小部件的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 小部件中的视频顶部绘画

qt - 在父窗口/小部件类中初始化子小部件的目的是啥?

Qt 删除窗口小部件

QT:如何关闭同一个小部件的多个窗口?

在子创建后设置父时,子小部件对事件是透明的

Qt 中的样式表、隐藏的小部件和大小