QT5 QPlatformNativeInterface и HWND
В одном из ответов на Get HWND на окнах с Qt5 (из WId) предлагается использовать QPlatformNativeInterface для восстановления обработчика собственного окна.
Чтобы получить доступ к заголовку QT, хотя в примере используется полный путь:
#include <QtGui/5.0.0/QtGui/qpa/qplatformnativeinterface.h>
Это, конечно, не приемлемо как окончательное решение. Есть ли способ включить QPlatformNativeInterface, используя систему включения по умолчанию QT?
Обратите внимание, что ни
#include <QPlatformNativeInterface>
работает (этот файл не генерируется во время сборки QT по умолчанию)
ни
#include <QGuiApplication>
работает (который содержит только предварительное объявление QPlatformNativeInterface)
4 ответа
Ты можешь использовать
QT += gui-private
в вашем файле проекта, как в примере плагина, а затем просто
#include <qpa/qplatformnativeinterface.h>
должно работать (у меня работает как минимум).
Эти API действительно являются частными, но если вам нужно их использовать, я думаю, это лучше, чем добавлять #ifdef
для каждой версии.
Для CMake вам придется использовать это:
find_package(Qt5Gui)
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})
и затем используйте обычное включение для вашего исходного файла:
#include <qpa/qplatformnativeinterface.h>
При поиске немного больше, кажется, что QPlatformNativeInterface в настоящее время является закрытым и станет общедоступным как часть абстракции платформы Qt, когда эта библиотека стабилизируется.
На самом деле winId() должен работать нормально, НО вы должны иметь в виду факт (который не упоминается в ответе, с которым вы связаны), что этот HWND будет сгенерирован UPON-запросом. Так работает Qt, он использует средство рисования владельца и не создает стандартные дескрипторы окон для всего (вы можете увидеть это, например, вы Spy из MSDN), но как только вы запрашиваете HWND, он создаст соответствующую сущность и вернет вам действительный HWND, так что он будет виден для шпиона (вы можете попробовать это на любом стандартном виджете)