是否可以将QWidget声明为在Qt之外创建的窗口的子窗口?

是否可以将QWidget声明为在Qt之外创建的窗口的子窗口?,qt,window,native,handle,Qt,Window,Native,Handle,我想在我的浏览器插件中使用Qt,但我不能创建自己的窗口,浏览器可以 我想做的是创建一个QWidget作为本机窗口句柄的子项。。。这是可能的吗?只有当您可以将其转换为QWidget时。您可以通过调用自定义widget的构造函数来接管本机窗口句柄。请注意,它是一个受保护的方法,因此您不能在普通的QWidget上调用它。如果您使用的是对话框而不是嵌入式窗口,那么调用它相对比较容易。在顶级小部件上调用QWidget::winId()。在Qt4中,这将返回一个WId,它是HWND的预处理器定义。在Qt5中

我想在我的浏览器插件中使用Qt,但我不能创建自己的窗口,浏览器可以


我想做的是创建一个QWidget作为本机窗口句柄的子项。。。这是可能的吗?

只有当您可以将其转换为QWidget时。

您可以通过调用自定义widget的构造函数来接管本机窗口句柄。请注意,它是一个受保护的方法,因此您不能在普通的
QWidget

上调用它。如果您使用的是对话框而不是嵌入式窗口,那么调用它相对比较容易。在顶级小部件上调用
QWidget::winId()
。在Qt4中,这将返回一个
WId
,它是
HWND
的预处理器定义。在Qt5中,
WId
HWND
的类型定义,因此必须执行显式强制转换:

HWND hwnd = (HWND)widget->winId()
不幸的是,Qt5中的功能目前不可靠/部分损坏。从Qt5.4.1开始,它还没有得到解决,并且在源代码中有一个注释,
QWidget::winId()
正在“消失”。请注意,此问题主要影响Qt应用程序中的嵌入式本机windows,反之亦然。你的里程数可能会更好


注意:
QWidget::create()
用于在Qt中嵌入本机窗口。它可能不适用于您的情况。

您不可能将任何内容从本机操作系统转换为QWidget。QWidget::create是否产生OP想要的父/子关系?老实说,我不知道,但我想是这样。现在,如果窗口已经包含自己的UI元素(按钮等),那么我不认为这些元素会自动转换为相应的QWidget。你最好从一个新的空窗口开始。