QT5 QPlatformNativeInterface和HWND

16

在回答 Get HWND on windows with Qt5 (from WId)中,建议使用 QPlatformNativeInterface 来恢复本机窗口句柄。

为了访问QT头文件,该示例使用了完整路径:

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

当然,这并不是一个明确的解决方案,有没有一种方法可以使用QT的默认包含系统来包含QPlatformNativeInterface

请注意,以上两种情况都不可行。

#include <QPlatformNativeInterface> 

工作(此文件不在默认QT构建过程中生成)

也不

#include <QGuiApplication>

作品(其中仅包含 QPlatformNativeInterface 的前向声明)

4个回答

12
你可以使用

QT += gui-private

示例插件中一样,在您的项目文件中进行设置,然后只需

#include <qpa/qplatformnativeinterface.h>

应该可以工作(至少对我来说是这样)。

这些API确实是私有的,但如果你不得不使用它们,我猜这比为每个版本添加#ifdef要好。


像CMAKE这样的外部构建系统怎么样? - Pierluigi
我不熟悉CMAKE。 :( 但我猜你需要找到一些方法将-I [include_path] / QtGui / [version] / QtGui添加到Makefiles中。也许查看qmake源代码可以帮助... - jkozera

11

对于CMake,你需要使用以下内容:

find_package(Qt5Gui)
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})

接着在源文件中使用普通的include:

#include <qpa/qplatformnativeinterface.h>

1

通过进一步搜索,似乎 QPlatformNativeInterface 目前是私有的,并将作为 Qt 平台抽象 的一部分公开,当该库稳定后。


0

实际上,winId() 应该可以正常工作,但是你应该记住一个事实(在你链接的答案中没有提到),即此 HWND 将在请求时生成。这是 Qt 的工作方式,它使用所有者绘制功能,并不为所有内容创建标准窗口句柄(例如,您可以从 MSDN 上的 Spy 中看到这一点),但是只要您请求 HWND,它就会创建一个适当的实体并返回一个有效的 HWND,因此它将对 Spy 可见(您可以在任何标准小部件上尝试此操作)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接