【Qt】QML-02:QQuickView用法

news2025/1/12 22:00:55

1、先看demo

QtCreator自动生成的工程是使用QQmlApplicationEngine来加载qml文件,下面的demo将使用QQuickView来加载qml文件

#include <QGuiApplication>
#include <QtQuick/QQuickView>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    
    QQuickView view;
    view.setSource(QUrl(QLatin1String("qrc:/main.qml")));
    view.setTitle("Hello World");
    view.show();

    return app.exec();
}

setTitle()和show()这两个接口函数是不是很眼熟,没错QQuickView和QWindow的使用方法很相似,其实QQuickView继承自QQuickWindow,而QQuickWindow就是继承自QWindow

QQuickView加载qml文件使用接口函数:setSource()

2、Window元素在QQuickView中不显示

当修改完mian.cpp后,直接运行时有窗口,但是大小和标题不是qml文件中Windowu元素设置的。
原因是:Window元素在QQuickView中不显示。
需要修改qml文件,修改后的qml文件如下:

import QtQuick 2.15
Rectangle {
     id: rect
     width: 640;
     height: 480
     color: "red"
}

运行效果如下:
在这里插入图片描述

3、Window元素必须用在QQmlApplicationEngine中

QQuickView会自动创建根窗口,QQmlApplicationEngine不会自动创建根窗口,因此在使用QQmlApplicationEngine加载的根qml文件中需要使用Window对象为 Qt Quick 场景创建一个新的顶级窗口。此时,QML 拥有窗口的完整控制权,可以直接设置标题、窗口尺寸等属性。

4、 QQuickWidget和QQuickView的区别

QQuickWidget的继承自QWidget,可以直接添加到Qt布局中;
QQuickView继承自QQuickWindow(继承自QWindow),通过转换才能添加到Qt布局中:

QQuickView *view = new QQuickView();
QWidget *widget = QWidget::createWindowContainer(view, this);
view->setSource(QUrl("qrc:/main.qml"));

5、在QML中使用C++

5.1 定义C++类

要想在QML中调用C++类,C++类的定义有一定要求
1)声明:Q_OBJECT
QML使用的是Qt的元对象系统,因此需要在类开头声明:Q_OBJECT

2)修饰函数:Q_INVOKABLE
使用Q_INVOKABLE修饰的成员函数,才能被Qt元对象系统识别;
否则在调用成员函数时报错

TypeError: Property 'xxx' of object xxx is not a function

3)修改枚举:Q_ENUMS
使用Q_ENUMS修饰的枚举,才能被Qt元对象系统识别;

4)定义属性:Q_PROPERTY

Q_PROPERTY(type name
   READ getFunction
   [WRITE setFunction]
   [RESET resetFunction]
   [NOTIFY notifySignal]
   [DESIGNABLE bool]
   [SCRIPTABLE bool]
   [STORED bool]
   [USER bool]
   [CONSTANT]
   [FINAL])

例如:Q_PROPERTY(double testValue READ getTestValue WRITE setTestValue)

5)本例中只展示Q_INVOKABLE的用法

class Class2Qml : public QObject
{
    Q_OBJECT
public:
    explicit Class2Qml(QObject *parent = nullptr);
    Q_INVOKABLE void call(const QString &msg);
};

void Class2Qml::call(const QString &msg)
{
    qDebug() << "Class2Qml, msg = " << msg;
}

5.2 将C++类引入QML中

使用QQuickView::rootContext()->setContextProperty来引入C++类到QML中

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    Class2Qml c2q;
    QQuickView view;
    view.setSource(QUrl(QLatin1String("qrc:/quickView.qml")));
    view.setTitle("Hello World");
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.rootContext()->setContextProperty("c2q", &c2q);
    view.show();
    
    return app.exec();
}

5.3 在QML中使用C++类

在QML中可以通过使用==类名.成员函数名(参数)==的格式来调用即可,完整的QML代码如下

import QtQuick 2.15
import QtQuick.Controls 2.15

Rectangle {
     id: rect
     width: 640;
     height: 480
     color: "red"
     Button {
         id: btn1
         width: 50
         height: 50
         x:100
         y:100
         text:"msg"
         onClicked: {
             c2q.call("quickView Rectangle")
         }
     }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯单片机第八届国赛 真题+代码

iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础&#xff0c;根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求&#xff0c;进行代码调试和修改。 */ #include <STC1…

生态共建丨YashanDB与构力科技完成兼容互认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB V22.2与北京构力科技有限公司BIMBase云平台完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容、运行稳定。 崖山数据库系统YashanDB是深算院自主研发设计的新型数据库系统&#xff0c;融入原创理论&#xf…

新手小白学习SWAT模型【建模方法、实例应用、高级进阶】

目录 第一部分&#xff1a;SWAT模型实践部分 第二部分&#xff1a;SWAT模型【进阶部分】 更多推荐 【专家】&#xff1a;刘老师【副教授】&#xff0c;北京重点高校资深专家&#xff0c;和美国SWAT软件开发方长期合作&#xff0c;拥有丰富的科研及工程技术经验&#xff0c;长…

vue3点击生成二维码

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;vue点击生成二维码 目录大纲 html部分 js部分 css部分 html部分 当点击他的时候触发弹窗 <div class"tuand_Text"><div class"text_OBJ"><div><img src&q…

铁路关基保护新规:优先采购安全可信的网络产品和服务!

《征求意见稿》第十四条提到&#xff1a;运营者应当加强供应链安全保护&#xff0c;优先采购安全可信的网络产品和服务&#xff1b;采购网络产品和服务影响或者可能影响国家安全的&#xff0c;运营者应当预判网络产品和服务投入使用后可能带来的国家安全风险&#xff0c;按照国…

intellij 编辑器内性能提示

介绍 IntelliJ IDEA已经出了最新版的2023.2&#xff0c;最耀眼的功能无法两个 AI Assistant编辑器内性能提示 AI Assistant 已经尝试过了是限定功能&#xff0c;因为是基于open ai,所以限定的意思是国内无法使用&#xff0c;今天我们主要介绍是编辑器内性能提示 IntelliJ Pr…

API调试工具用什么?试试Apipost

前言 Apipost是一款支持 RESTful API、SOAP API、GraphQL API等多种API类型&#xff0c;支持 HTTPS、WebSocket、gRPC多种通信协议的API调试工具。除此之外&#xff0c;Apipost 还提供了自动化测试、团队协作、等多种功能。这些丰富的功能简化了工作流程&#xff0c;提高了研发…

软件测试-基础阶段学习

目录 一、测试介绍 二、测试常用分类 三、模型 四、测试流程 五、测试用例 六、用例设计方法 七、缺陷 八、html 资料获取方法 阶段目标 能独立针对web项目实施功能测试 一、测试介绍 什么是软件测试 使用技术手段验证软件是否满足需求 测试主流技能 功能测试自…

【JAVASE】顺序和选择结构

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 顺序和选择 1. 顺序结构2. 分支结构2.1 …

MySQL的入门使用

在命令提示符内使用MySQL MySQL安装好后&#xff0c;就可以简单的尝试使用它。 打开&#xff1a;命令提示符程序&#xff0c;输入&#xff1a;mysql -uroot -p&#xff0c;然后回车后输入密码&#xff0c;即可进入命令行环境 在MySQL的命令行环境下&#xff0c;可以通过&…

【换根DP】Subtree

Subtree - 洛谷 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn1e510; const int mxv1e510;vector<int> G[mxn]; int N,P,u,v; int f[mxn],g[mxn],son[mxn],pre[mxn],suf[m…

Acwing.901 滑雪(动态规划)

题目 给定一个R行C列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第i行第j列的点表示滑雪场的第i行第j列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。当然&#xff0c;一个人能够滑动到某相邻区域的前…

CTF PWN-攻防世界Overflow整数溢出漏洞

文章目录 前言整数溢出有符号整数溢出无符号整数回绕截断与宽度溢出 int_overflow题目漏洞分析EXP程序构造 总结 前言 滴水穿石&#xff0c;非一日之功。继续练习攻防世界 PWN 题目&#xff0c;此次练习的题目是 int_overflow&#xff0c;顾名思义是整数溢出类型的漏洞&#x…

小波分解机械信号

function [ output_args ] ex4_2( input_args ) %EXAMPLE4_2 Summary of this function goes here % Detailed explanation goes here clc; clear; load sumsin; s sumsin; % 进行3层小波分解&#xff0c;小波基函数为db3 [c,l] wavedec(s,3,db3); figure(1) subplot(21…

flutter minio

背景 前端 经常需要上传文件 图片 视频等等 到后端服务器&#xff0c; 如果到自己服务器 一般会有安全隐患。也不方便管理这些文件。如果要想使用一些骚操作 比如 按照前端请求生成不同分辨率的图片&#xff0c;那就有点不太方便了。 这里介绍以下 minio&#xff0c;&#xff0…

Vue如何实现页面跳转路由,实现单页面跳转

1、#锚链接&#xff0c;#后面的就是锚链接 2、#之后都是hash地址&#xff0c;这些都是在浏览器的F12中获得的 3、在浏览器查询链接地址的方法&#xff0c;href代表着当前的浏览器地址&#xff0c;&#xff1a; 使用location.href: 4、只想获取#链接地址&#xff0c;后面加loc…

Linux设备模型之input子系统详解

在键盘驱动代码分析的笔记中&#xff0c;接触到了input子系统.键盘驱动&#xff0c;键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层&#xff0c;为上层提供了一个统一的界面。例如&#xff0c;在终端系统中&#xff0c;我们不需要去管…

Redis(五)—— Redis进阶部分

一、Redis配置文件详解 注意这是Redis服务本身的配置文件&#xff0c;相当于maven的settings.xml&#xff0c;而不是我们在springboot去配置Redis的那个application.yml。 核心部分include 引入其他redis配置文件&#xff0c;相当于spring的<import>bind 设置IP&#xf…

【Java|golang】2500. 删除每行中的最大值

给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其中任何一个。 将删除元素中的最大值与答案相加。 注意 每执行一次操作&#…

【Vue3】递归组件

1. 递归组件mock数据 App.vue <template><div><Tree :data"data"></Tree></div> </template><script setup lang"ts"> import { reactive } from vue; import Tree from ./components/Tree.vue; interface Tr…