qtwidget嵌入qml

我在学习qml的过程中想到了一个问题,qtwidget界面如何嵌入qml组件。接下来时一步步实现

我们和往常一样先创建一个mainwindow程序,在模块中加入

 QT += quickwidgets

因为我们需要用到

#include

这个组件把qml包装起来,这个组件的属性和函数可以在qtcreater中搜到看看,接下来就是和往常用其他组件一样创建组件,设置组件属性把他和qml程序关联起来,源码如下

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建 QQuickWidget 容器
    QQuickWidget *qmlWidget = new QQuickWidget(this);
    qmlWidget->setSource(QUrl("qrc:/main.qml"));  // 加载 QML 文件
    qmlWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);  // QML 尺寸随容器变化

    // 设置为主窗口中心组件
    setCentralWidget(qmlWidget);
    resize(800, 600);  // 初始窗口大小
}

MainWindow::~MainWindow()
{
    delete ui;
}

 创建一个资源文件,创建一个测试用的qml程序放进去保存文件结构如下:

qtwidget嵌入qml_第1张图片

qml程序内容:

import QtQuick
import QtQuick.Controls

Rectangle {
    color: "lightblue"
    border.color: "navy"
    border.width: 2
    radius: 10

    Text {
        text: "嵌入的 QML 组件"
        anchors.centerIn: parent
        font.pixelSize: 24
    }
}

 正常运行效果如下:

qtwidget嵌入qml_第2张图片

 如果运行报错

D:\Qttest\qmltest\mainwindow.cpp:11: error: undefined reference to `__imp__ZN12QQuickWidgetC1EP7QWidget'

这个错误是检测到库连接的问题,检查下1.qt有没有安装qtquick模块2..pro文件有没有加上模块并保存3.还是解决不了的话找到项目根目录把build文件删了重新编译基本能解决

如果不想把他放到中心区域就在ui界面拖一个frame什么的组件布好局,用addwidget把qmlwidget加进去就行了

若需 QQuickWidget 背景透明,添加:

qmlWidget->setClearColor(Qt::transparent);
qmlWidget->setAttribute(Qt::WA_AlwaysStackOnTop); // 防止被其他 Widget 遮挡

 

QML 内容适配
在 QML 根组件中启用锚点填充,避免黑边:

// main.qml
Rectangle {
    anchors.fill: parent // 填充 QQuickWidget
    // ...其他内容
}

 

性能优化
嵌入多个 QML 组件时,建议每个 QQuickWidget 独立缓存:

qmlWidget->setGraphicsDevice(QQuickWindow::PersistentGLContext);

 

你可能感兴趣的:(qt6,c++,QML,qt)