Qt4アプリケーションをQt5に変換しようとしています。私が理解できなかった唯一のことは、ウィジェットの[〜#〜] hwnd [〜#〜]を取得する方法です。プログラムは EcWin7 を使用してwin 7+のタスクバーアイコンに進行状況を表示しますが、[〜#〜] hwnd [〜#〜]が必要です。 Q_WS_WINをQ_OS_WIN)に変更した後、lib自体は問題なくコンパイルされるようですWIdは[〜#〜] hwnd [〜#〜]のtypedefであったため、これは問題ありませんでした。 Qt5では、これはもう当てはまりません。私はいくつかの メーリングリストの投稿 を見つけましたが、手掛かりを与えることができますが、Qt5のパブリックAPIの一部ではないQPlatformNativeInterfaceのようです.
プログラムはEcWin7.init(this-> 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;
}
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();
試すことができます:
(HWND)QWidget::winId();
この関数を試してください:QWindowsNativeInterface::nativeResourceForWindow