我正在尝试将Qt4应用程序转换为Qt5。 我唯一想知道的是如何获取Widget的 HWND 。 该程序使用EcWin7显示win 7+上任务栏图标的进度,但需要 HWND 。将 Q_WS_WIN 更改为 Q_OS_WIN 后,lib本身似乎编译良好 在Windows上的Qt4 WId 只是 HWND 的typedef,所以这没问题。 在Qt5中,情况不再如此。 我找到了一些可以提供线索的mailing list posting,但似乎 QPlatformNativeInterface 不再是Qt5公共API的一部分了。
程序调用 EcWin7.init(this-> winId()); 并且我需要某种方式将此ID转换为 HWND id或其他得到这个的方法。
答案 0 :(得分:21)
在Qt5中,winEvent
替换为nativeEvent
:
bool winEvent(MSG* pMsg, long* result)
现在是
bool nativeEvent(const QByteArray & eventType, void * message, long *result)
在EcWin7::winEvent
中,您必须将void
投射到MSG
:
bool EcWin7::winEvent(void * message, long * result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
if (msg->message == mTaskbarMessageId)
{
...
我能够让应用程序正常运行!只需替换:
mWindowId = wid;
与
mWindowId = (HWND)wid;
答案 1 :(得分:10)
#include <QtGui/5.0.0/QtGui/qpa/qplatformnativeinterface.h>
static QWindow* windowForWidget(const QWidget* widget)
{
QWindow* window = widget->windowHandle();
if (window)
return window;
const QWidget* nativeParent = widget->nativeParentWidget();
if (nativeParent)
return nativeParent->windowHandle();
return 0;
}
HWND getHWNDForWidget(const QWidget* widget)
{
QWindow* window = ::windowForWidget(widget);
if (window && window->handle())
{
QPlatformNativeInterface* interface = QGuiApplication::platformNativeInterface();
return static_cast<HWND>(interface->nativeResourceForWindow(QByteArrayLiteral("handle"), window));
}
return 0;
}
答案 2 :(得分:2)
您可以尝试:
(HWND)QWidget::winId();
答案 3 :(得分:2)
winId()在Qt 5.1上为我工作 当我使用
时,至少它具有相同的值bool Widget::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
qDebug() << msg->hwnd;
return false;
}
和
qDebug() << winId();
答案 4 :(得分:1)
尝试此功能:QWindowsNativeInterface::nativeResourceForWindow