【问题标题】:Is it possible to declare a QWidget as a child of a window created outside of Qt?是否可以将 QWidget 声明为在 Qt 之外创建的窗口的子窗口?
【发布时间】:2011-07-08 21:02:03
【问题描述】:

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

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

【问题讨论】:

    标签: qt window native handle


    【解决方案1】:

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

    HWND hwnd = (HWND)widget->winId()
    

    不幸的是,Qt5 中的功能目前不可靠/部分损坏。从 Qt 5.4.1 开始,它还没有解决,并且源代码中有一条注释指出 QWidget::winId() 正在“消失”。请注意,此问题主要影响 Qt 应用程序中的嵌入式本机窗口,反之亦然。你的里程可能会更好。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 没有办法你应该将任何东西从本机操作系统转换为 QWidget。
        • QWidget::create 会产生 OP 想要的父子关系吗?
        • 老实说,我不知道,但我想是的。现在,如果窗口已经包含自己的 UI 元素(按钮等),那么我认为这些元素不会自动转换为相应的 QWidget。您最好从一个新的空窗口开始。
        猜你喜欢
        • 1970-01-01
        • 2011-02-22
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2013-01-30
        • 1970-01-01
        相关资源
        最近更新 更多