是否可以将 QWidget 声明为在 Qt 外部创建的窗口的子窗口?
我想在浏览器插件中使用 Qt,但我无法创建自己的窗口,而是浏览器创建。
我想做的是创建一个 QWidget 作为本机窗口句柄的子级......这可能吗?
I'd like to use Qt in my browser plugin, but I don't get to create my own window, the browser does.
What I'd like to do is create a QWidget as a child of a native window handle... Is this possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以通过调用
QWidget::create( 来接管本机窗口句柄)
在您的自定义小部件的构造函数中。请注意,它是一个受保护的方法,因此您无法在普通的QWidget
上调用它。You may be able to take over a native window handle by calling
QWidget::create()
in your custom widget's constructor. Note that it's a protected method so you can't call it on a normalQWidget
.如果您使用的是对话框而不是嵌入式窗口,则相对容易。在您的顶级小部件上调用
QWidget::winId()
。在 Qt4 中,这将返回一个WId
,它是HWND
的预处理器定义。在 Qt5 中,WId
是HWND
的类型定义,因此您必须执行显式转换:不幸的是,Qt5 中的功能当前不可靠/部分损坏。从 Qt 5.4.1 开始,该问题尚未解决,并且源代码中有一条说明
QWidget::winId()
正在“消失”。请注意,此问题主要影响 Qt 应用程序中的嵌入式本机窗口,反之亦然。你的里程可能会更好。注意:
QWidget::create()
用于在 Qt 中嵌入本机窗口。它可能不适用于您的情况。If you're using a dialog and not an embedded window it's relatively easy. Call
QWidget::winId()
on your top-level widget. In Qt4 this will return aWId
, which is a preprocessor definition forHWND
. In Qt5,WId
is a typedef forHWND
, so you have to perform an explicit cast:Unfortunately, the functionality in Qt5 is currently unreliable/partially broken. As of Qt 5.4.1, it's not resolved and there's a note in the source that
QWidget::winId()
is "going away". note that this issue primarily affects embedded native windows in a Qt app, not vice versa. Your mileage may be better.Note:
QWidget::create()
is intended for embedding native windows in Qt. It probably does not apply in your situation.仅当您可以将其转换为 QWidget 时。
Only if you can cast it as a QWidget.