c++ - Qt 小部件在其他非 qt 窗口之上

标签 c++ windows qt widget

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

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

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

我找到了一种将它放在顶部的方法,在 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 派生类。当我把它放在顶部时,这个小部件是黑色的,而如果我不调用该方法,它就可以正常工作。

我怎样才能正确地提升 QWidget 的顶部?

最佳答案

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

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

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

关于c++ - Qt 小部件在其他非 qt 窗口之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22864561/

相关文章:

c++ - 从 QT 中的字符串显示(呈现)HTML

C++ 获取可变参数模板参数包中参数的并集?

windows - 为什么 "Git help <command>"没有像它说的那样在我的浏览器中启动 html 帮助?

c++ - 在 C/C++ 中监视变量访问

windows - 如何在 Windows 7 中使用 C++ 检测哪个网络接口(interface)接收到 UDP 数据包?

c# - 如何在 Windows 窗体中实例化大量按钮?

c++ - 第一次通话后断开插槽的优雅方式

c++ - 从 Slot qt 创建时 MessageDialog 卡住

c++ - 使用 GCC 程序集向左/向右旋转移动次数

c++ - 添加两个字符时为什么没有整数溢出?