25. 在QWidget窗口中嵌入QML界面
创始人
2025-05-30 10:00:04
0

1. 说明:

QML开发界面是最近才开始流行,在之前的老项目中一般都是使用QWidget进行开发,其界面设计不是很美观,但能够实现的功能是挺多的,这些是QML无法实现的。如果想在QWidget的基础上对界面进行美化,则可以将QML界面嵌入到QWidget当中进行使用。与QML界面嵌入QWidget窗口这篇博客也有共通之处。
效果展示

QWidget窗口加载QML界面

2. 实现方式:

将QML界面嵌入到QWidget窗口当中,主要利用到的控件是QQuickWidget小控件。因为要使用到QWidget,所以要在项目的.pro文件中加入quickwidgets库:QT += quickwidgets

2.1 第一步:

首先,创建一个QWidget框架的项目,并在界面当中拖入一个QQuickWidget控件,如下图所示:
在这里插入图片描述

2.2 第二步:

然后,创建一个QML文件用于加载到QWidget窗口中,因为用于承载qml页面的小控件是QQuickWidget,qml文件中根节点最好使用Item或者Rectangle,不要使用Window,可能会出错。本文章具体qml文件代码如下:

import QtQuick 2.15
import QtQuick.Controls 2.15Item {width: parent.widthheight: parent.heightvisible: truefunction toRed(){bck.color = "red"}function toBlue(){bck.color = "blue"}Rectangle{id:bckobjectName: "background"anchors.fill: parentcolor: Qt.rgba(0.0,0.0,0.0,0.5)}signal rectRed()signal rectBlue()Button{id:firstwidth: 100height: 50anchors.left: parent.leftanchors.leftMargin: 10anchors.verticalCenter: parent.verticalCentertext: "Red"onClicked: {rectRed()}}Button{id:secondwidth: 100height: 50anchors.right: parent.rightanchors.rightMargin: 10anchors.verticalCenter: parent.verticalCentertext: "Blue"onClicked: {rectBlue()}}
}

2.3 第三步:

加载QML文件之前,需要将QML文件以资源文件的形式放入到整个项目中进行使用。
在项目文件上右键鼠标,选择Add New…:
在这里插入图片描述
在弹出的窗口中选择***Qt -> Qt Resource File ***:
在这里插入图片描述
根据指引一步步将qml文件添加到资源文件中即可。

2.4 第四步:

在项目目录树中打开QWidget窗口对应的代码文件,在其中引入QML文件,在qml文件中定义了两个信号和两个函数,在widget窗口中对这两个信号进行连接,并在对应的槽函数中去调用qml中的函数,以改变qml界面的填充颜色。具体代码和注释如下:
Widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void onRectRed();//槽函数,用于响应QML中的信号void onRectBlue();//槽函数,用于响应QML中的信号private:Ui::Widget *ui;
};
#endif // WIDGET_H

Widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QUrl source("qrc:/qmls/qmlInWidget.qml");//加载QML文件ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView );//设置QML界面整体填充QQuickWidget控件ui->quickWidget->setSource(source);//指定加载源QQuickItem* item = ui->quickWidget->rootObject();//获取quickwidget中的qml根对象connect(item,SIGNAL(rectRed()),this,SLOT(onRectRed()));//连接QML中的信号connect(item,SIGNAL(rectBlue()),this,SLOT(onRectBlue()));//连接QML中的信号}Widget::~Widget()
{delete ui;
}void Widget::onRectRed()
{QQuickItem* item = ui->quickWidget->rootObject();QMetaObject::invokeMethod(item,"toRed");//调用QML中的方法
}void Widget::onRectBlue()
{QQuickItem* item = ui->quickWidget->rootObject();QMetaObject::invokeMethod(item,"toBlue");//调用QML中的方法
}

持续更新中,请大家多多关注…

相关内容

热门资讯

Word怎么转换成PDF文件格... PDF是一种通用的文件格式,它可以在不同操作系统和设备上保持一致的显示效果。在日常工作...
【C++】面试101,二叉搜索... 目录 1.二叉搜索树的最近公共祖先  2.在二叉树中找到两个节点的最近公共祖先 3.序列化二叉树 4...
linux简单入门 目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Lin...
LP周报丨央企创投母基金来了,... 一级市场再现重量级玩家。本周,由国务院国资委指导、中国诚通控股集团有限公司牵头组建的“诚通科创投资基...
估值600多亿,马斯克的超级独... 刚宣布回归全天候工作没多久,马斯克便给旗下公司融了一笔钱。几天前,马斯克创立的脑机接口公司Neura...
Python3 入门教程||P... Python3 数据结构本章节我们主要结合前面所学的知识点来介绍 Python 数据结构。列表Pyt...
0110 Tomcat 1.JavaWeb 所有通过Java语言编写可以通过浏览器访问的程序的总称叫JavaWebÿ...
C++ Primer第五版_第... 文章目录练习4.1练习4.2练习4.3练习4.4练习4.5练习4.6练习4.7练习4.8练习4.9练...
LuaJIT 栈帧布局(sta... 对于任何的目标架构(如x86、arm、loongarch),...
【必看】最全开窗函数讲解和实战... 窗口函数(Window Function)是 SQL2003 标准中定义...
PyTorch入门(六)使用T...   在文章PyTorch入门(五)使用CNN模型进行中文文本分类中&#x...
app自动化测试——特殊控件T... 文章目录一、Toast弹窗是什么二、Toast 定位方式一:方式二三、案例1、特别注意...
零基础入门学习Python 0... 目录 1.递归 2.异常处理 1.递归 啥是递归 相当于函数调用自身对栈操作频繁,...
云原生周刊:12 个容易忽略的... 文章推荐 12 个容易忽略的 Kubernetes 安装错误 这篇文章总结了 12 个在 Kuber...
渗透测试靶机vulnhub——... 信息收集fscan扫描存活主机PS C:\Users\lenovo\Desktop\HackTool...
在 Python 中替换字典中... 使用 dict.update() 方法替换字典中的值,例如 my_dict.updat...
python:数据结构内容(1... 文章目录壹、元组定义1、创建元组2、访问元组中数据3、元组的连接4、删除元组5、常用的元组函数贰、列...
UEFI开发学习 - Vari... Variable Services是Runtime Services的一部分,提供关于...
MyBatis注解开发 1.MyBatis的注解开发 1.11.MyBatis的常用注解开发 这几年来注解开发越来越流行&#...
你真的会写软件测试计划吗?所有... 目录 1引言 1.1编写目的 1.2背景 1.3定义 1.4参考资料 2计划 2.1软件说明 2.2...