我正在为我在 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/