J'essaie de convertir une application Qt4 en Qt5 . La seule chose que je n'ai pas pu comprendre, c'est comment obtenir le HWND d'un widget . Le programme utilise EcWin7 pour afficher la progression sur l’icône de la barre des tâches sous Win 7+, mais attend un HWND. La bibliothèque elle-même semble bien se compiler après avoir changé Q_WS_WIN en Q_OS_WIN) Dans Qt4 sous Windows WId, il ne s'agissait que d'un typedef pour HWND, donc ce n'était pas problem . Dans Qt5, ce n'est plus le cas . J'ai trouvé quelques envoi sur une liste de diffusion qui pourrait donner un indice, mais il semble que QPlatformNativeInterface ne fait plus partie de l'API publique de Qt5. .
Le programme appelle EcWin7.init (this-> winId ()); et j'ai besoin d'un moyen de convertir cet ID en HWND id ou d'un autre moyen d'obtenir ceci.
Dans Qt5, winEvent
a été remplacé par nativeEvent
:
bool winEvent(MSG* pMsg, long* result)
est maintenant
bool nativeEvent(const QByteArray & eventType, void * message, long *result)
Et dans EcWin7::winEvent
vous devez convertir void
en MSG
:
bool EcWin7::winEvent(void * message, long * result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
if (msg->message == mTaskbarMessageId)
{
...
J'ai réussi à faire en sorte que l'application fonctionne! Il suffit de remplacer:
mWindowId = wid;
avec
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;
}
Vous pouvez essayer:
(HWND)QWidget::winId();
winId () a travaillé pour moi sur Qt 5.1au moins, il a la même valeur quand j'utilise
bool Widget::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
qDebug() << msg->hwnd;
return false;
}
et
qDebug() << winId();
Essayez cette fonction: QWindowsNativeInterface::nativeResourceForWindow