其他非 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 小部件的主要内容,如果未能解决你的问题,请参考以下文章