Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 其他非Qt窗口顶部的Qt小部件_C++_Windows_Qt_Widget - Fatal编程技术网

C++ 其他非Qt窗口顶部的Qt小部件

C++ 其他非Qt窗口顶部的Qt小部件,c++,windows,qt,widget,C++,Windows,Qt,Widget,我正在为我在Windows操作系统中使用的商业程序开发一个插件(我无法更改它)。在这个插件中,我创建了一个Qt小部件,当在主程序中单击一个按钮时,Qt小部件就会出现 我的问题是,小部件显示在主程序窗口下,而我希望它位于其顶部。如有必要,它可以始终保持在顶部 似乎不在这里工作,因为我没有父母 我找到了一种方法将其放在顶部,遵循,并且我创建了一个在小部件构造函数之后调用的方法: void RadiationPatternWidget::setWindowTopMost() { #ifdef Q_WS

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

我的问题是,小部件显示在主程序窗口下,而我希望它位于其顶部。如有必要,它可以始终保持在顶部

似乎不在这里工作,因为我没有父母

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

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();
然后我在构造函数之后调用它:

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无法使用的功能,如果窗口被打开,它们将无法单击。单击()信号不会被捕获,当我用鼠标单击按钮时,按钮图像不会改变
  • 在小部件内部,我使用一个派生的QGLWidget派生类。当我把它放在上面时,这个小部件是黑色的,而如果我不调用这个方法,它工作得很好

我怎样才能正确地在小部件上提升?

在使用您的hack之前,检查
小部件->窗口()->raise()
是否不能工作

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


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

这是什么Qt版本?我使用的Qt版本是4.8.5。如何检索该类?@Jepessen阅读MSDN中的窗口类。不幸的是,我一点也不知道。。。