qtwidget嵌入qml

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

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

 QT += quickwidgets

因为我们需要用到

#include<QtQuickWidgets/QQuickWidget>

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

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtQuickWidgets/QQuickWidget>

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程序放进去保存文件结构如下:

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
    }
}

 正常运行效果如下:

 如果运行报错

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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值