Qt Quick示例 - 集成在_widget中

演示如何通过QWidget::createWindowContainer()将QQuickWindow嵌入QWidget UI中。

此示例演示了将Qt Quick内容添加到基于QWidget的应用程序的一种方法。QQuickView及其父类QQuickWindow都从QWindow派生。这意味着它们可以使用QWidget::createWindowContainer(),就像其他QWindow一样。

运行示例

要从Qt Creator运行此示例,请打开欢迎模式并从示例中选择示例。有关更多信息,请访问构建和运行示例

将窗口内部嵌入会导致在控件层次结构中创建本地子控件,并将窗口(示例中的QQuickView)重新作为父控件。容器控件负责重新定位子窗口,使其看起来是用户界面的一部分,尽管在现实中,它是一个独立的本地窗口,独立于其父级,QWidget基于顶级窗口。

MainWindow::MainWindow()
    : m_quickView(new QQuickView)
{
    QWidget *centralWidget = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);

    m_quickView->setResizeMode(QQuickView::SizeRootObjectToView);
    connect(m_quickView, &QQuickView::statusChanged,
            this, &MainWindow::quickViewStatusChanged);
    connect(m_quickView, &QQuickWindow::sceneGraphError,
            this, &MainWindow::sceneGraphError);
    m_quickView->loadFromModule("embeddedinwidgets", "Main");

    QWidget *container = QWidget::createWindowContainer(m_quickView);
    container->setMinimumSize(m_quickView->size());
    container->setFocusPolicy(Qt::TabFocus);

    layout->addWidget(new QLineEdit(QStringLiteral("A QLineEdit")));
    layout->addWidget(container);
    layout->addWidget(new QLineEdit(QStringLiteral("A QLineEdit")));
    setCentralWidget(centralWidget);

    QMenu *fileMenu = menuBar()->addMenu(tr("File"));
    fileMenu->addAction(tr("Quit"), qApp, &QCoreApplication::quit);
}

初始化过程中的关键步骤是创建容器,这是一个包含和托管QQuickView的QWidget。这个控件可以像任何其他QWidget一样添加到布局中。

注意:使用本地窗口嵌入仅是将QWidget和Qt Quick用户界面结合的一种可能方法。其他更常用的方法是QQuickWidget。请参阅Qt Quick Widgets示例了解使用QQuickWidget的示例。在渲染和事件处理方面,内部实现有显著差异。QQuickWidget根本不使用本地窗口,并将Qt Quick渲染重定向到一个纹理,然后通过3D图形API(如OpenGL或Vulkan)将其复合到QWidget内容的其余部分。这提供了更多灵活性,但代价是性能。它还适用于没有实际窗口系统和本地窗口概念的平台。而本示例展示的窗口嵌入方法可能性能更好,但最适合用户界面,其中Qt Quick内容占据一个固定的矩形区域,并且在之后不进行缩放、堆叠或裁剪。

示例项目 @ code.qt.io

另请参阅 QWidget::createWindowContainer.

© 2024 The Qt Company Ltd. 本文档中的内容贡献版权归各自所有者所有。提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3 许可。Qt及其相关标志是芬兰及其它国家/地区The Qt Company Ltd. 的商标。所有其他商标均属于各自所有者。