Подтвердить что ты не робот

QT5 QPlatformNativeInterface и HWND

В одном из ответов Get HWND на Windows с Qt5 (из WId) предлагается использовать QPlatformNativeInterface для восстановления собственный обработчик окна.

Чтобы получить доступ к заголовку QT, хотя пример использует полный путь:

#include <QtGui/5.0.0/QtGui/qpa/qplatformnativeinterface.h>

Это, конечно, неприемлемо как окончательное решение. Есть ли способ включить QPlatformNativeInterface, используя систему включения по умолчанию QT?

Обратите внимание, что ни

#include <QPlatformNativeInterface> 

работает (этот файл не создается во время сборки QT по умолчанию)

и

#include <QGuiApplication>

works (который содержит только объявление вперед QPlatformNativeInterface)

4b9b3361

Ответ 1

Вы можете использовать

QT += gui-private

в вашем файле проекта, как в примерном плагине, а затем просто

#include <qpa/qplatformnativeinterface.h>

должен работать (работает для меня как минимум).

Эти API действительно являются частными, но если вам нужно их использовать, я думаю, это лучше, чем добавление #ifdef для каждой версии.

Ответ 2

Для CMake вам нужно будет использовать это:

find_package(Qt5Gui)
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})

а затем используйте нормальный include для исходного файла:

#include <qpa/qplatformnativeinterface.h>

Ответ 3

Поискав немного больше, кажется, что QPlatformNativeInterface в настоящее время является закрытым и будет обнародован как часть Qt Platform Abstraction, когда эта библиотека стабилизируется.

Ответ 4

На самом деле winId() должен работать нормально, но вы должны иметь в виду факт (который не упоминается в ответе, на который вы ссылались), что этот HWND будет сгенерирован UPON-запрос. То, как работает Qt, использует его владельца и не создает стандартные дескрипторы окон для всего (вы можете видеть это, например, Spy из MSDN), но как только вы просите HWND, он создаст соответствующий объект и вернет вам действительный HWND, поэтому он будет виден для Spy (вы можете попробовать это на любом стандартном виджете)