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

时间:2014-04-04 13:43:04

标签: c++ windows qt widget

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

我的问题是小部件出现在主程序窗口下,而我想要它在它之上。如有必要,它可以永远保持在最佳状态。

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

我已经找到了一种方法可以将它放在Qt wiki之上,并且我创建了一个在widget构造函数之后调用的方法:

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?

1 个答案:

答案 0 :(得分:0)

在使用hack之前,请检查widget->window()->raise()是否无效。

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

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