Я пытаюсь преобразовать приложение Qt4 в Qt5.
Единственное, что я не мог понять, это как получить HWND виджета.
Программа использует EcWin7 показать прогресс на значке панели задач на Win 7+, но ожидает HWND. Сама библиотека вроде бы нормально компилируется после изменения Q_WS_WIN в Q_OS_WIN)
В Qt4 на Windows WID был просто typedef для HWND, так что с этим проблем не было.
В Qt5 это уже не так.
Я нашел некоторые рассылка рассылки это может дать подсказку, но кажется QPlatformNativeInterface больше не является частью публичного API Qt5.
Программа вызывает EcWin7.init (этом-> WinID ()); и мне нужно каким-то образом преобразовать этот идентификатор в 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;
}
Вы можете попробовать:
(HWND)QWidget::winId();
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();
Попробуйте эту функцию: QWindowsNativeInterface::nativeResourceForWindow