我尝试转换的Qt4应用QT5。 我无法弄清楚的唯一的事情是如何得到一个Widget的HWND。 该方案采用EcWin7显示上取胜7+任务栏图标的进展,但需要一个HWND。 的lib本身似乎在Windows上编译WID改变Q_WS_WIN到Q_OS_WIN)在Qt4的只是一个typedef的HWND后细,所以这是没有问题的。 在这QT5不一样了。 我发现了一些邮件列表中 ,可以给一个线索,但似乎QPlatformNativeInterface不是QT5的公共API的一部分了。
程序调用EcWin7.init(这- > winId()); 我需要一些方法来这个ID转换成HWND ID或一些其他的方式来得到这个。
在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;
#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;
}
试试这个功能: QWindowsNativeInterface::nativeResourceForWindow
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();