Получить HWND на окнах с Qt5 (от WId)

Я пытаюсь преобразовать приложение Qt4 в Qt5. Единственное, чего я не мог понять, это как получить HWND виджета. Программа использует EcWin7. чтобы показать прогресс на значке панели задач в win 7+, но ожидает HWND. Сама библиотека, кажется, компилируется нормально после изменения Q_WS_WIN на Q_OS_WIN) В Qt4 в Windows WId был просто определением типа для HWND, так что это не было проблемой. В Qt5 это уже не так. Я нашел некоторые сообщения в списке рассылки, которые могли бы дать подсказку, но это кажется, что QPlatformNativeInterface больше не является частью общедоступного API Qt5.

Программа вызывает EcWin7.init(this->winId()); и мне нужно каким-то образом преобразовать этот идентификатор в идентификатор HWND или каким-либо другим способом получить это .


person Josef says Reinstate Monica    schedule 27.12.2012    source источник
comment
Что ж, это странно. QWidget::winId() должен возвращать HWND на Windows, как это было в Qt4.   -  person Maciej    schedule 27.12.2012


Ответы (5)


В 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;
person MrElmar    schedule 21.04.2013
comment
К сожалению, багов очень много. Не все события передаются в реальный виджет, многие из них передаются в виджет верхнего уровня. - person Dmitry Sazonov; 19.03.2015

Вы можете попробовать:

(HWND)QWidget::winId();
person TheFox    schedule 09.01.2013

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();
person user1111324    schedule 13.07.2013

Попробуйте эту функцию: QWindowsNativeInterface::nativeResourceForWindow

person Filippok    schedule 27.12.2012

person    schedule
comment
подтверждение и дополнительные сведения о том, как его скомпилировать: lists. qt-project.org/pipermail/interest/2013-June/007650.html - person David Burson; 21.02.2014