34

我正在尝试将 Qt4 应用程序转换为 Qt5。我唯一想不通的是如何获取小部件的HWND。该程序使用EcWin7在 win 7+ 的任务栏图标上显示进度,但需要HWND在将Q_WS_WIN更改为Q_OS_WIN后,lib 本身似乎可以正常编译)在 Windows 上的 Qt4 中,WId只是HWND的 typedef ,所以这没问题。在 Qt5 中,情况不再如此。我发现了一些可以提供线索的邮件列表发布,但似乎QPlatformNativeInterface不再是 Qt5 的公共 API 的一部分。

程序调用EcWin7.init(this->winId()); 我需要某种方式将此 ID 转换为HWND id 或其他方式来获取它。

4

5 回答 5

25

在 Qt5winEvent中被替换为nativeEvent

bool winEvent(MSG* pMsg, long* result)

就是现在

bool nativeEvent(const QByteArray & eventType, void * message, long *result)

而且你必须EcWin7::winEvent投到:voidMSG

bool EcWin7::winEvent(void * message, long * result)
{
    MSG* msg = reinterpret_cast<MSG*>(message);
    if (msg->message == mTaskbarMessageId)
    {
      ...

我能够让应用程序正常工作!只需更换:

 mWindowId = wid;

 mWindowId = (HWND)wid;
于 2013-04-21T23:59:08.117 回答
11
#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; 
}
于 2013-01-24T11:27:56.387 回答
2

你可以试试:

(HWND)QWidget::winId();
于 2013-01-09T22:23:55.060 回答
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();
于 2013-07-13T05:12:40.867 回答
1

试试这个功能:QWindowsNativeInterface::nativeResourceForWindow

于 2012-12-27T09:33:54.103 回答