qml和c++结合使用

目录

        • 文章简介
        • 1. 创建qml工程
        • 2. 创建一个类和qml文件,修改main函数
        • 3. 函数说明:
        • 4. qml 文件间的调用
        • 5. 界面布局
        • 6. 代码举例

文章简介

初学qml用来记录qml的学习过程,方便后面归纳总结整理。

1. 创建qml工程

如下图,我使用的是一个空的qml的工程,这样更容易上手。
在这里插入图片描述

2. 创建一个类和qml文件,修改main函数

.h文件

#ifndef MYCPPOBJECT_H
#define MYCPPOBJECT_H#include <QObject>class MyCppObject : public QObject
{Q_OBJECTpublic:MyCppObject(QObject *parent = nullptr);signals:void sigButtonClick();public slots:void handleButtonClick();
};#endif // MYCPPOBJECT_H

cpp文件

#include "mycppobject.h"
#include <QDebug>
MyCppObject::MyCppObject(QObject *parent) : QObject(parent) {}void MyCppObject::handleButtonClick()
{qDebug() << "click";// 处理按键点击事件// ...// 发出自定义信号emit sigButtonClick();
}

main函数

int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);//注册自定义类qmlRegisterType<MyCppObject>("GenOsal", 0, 1, "MyCppObject");// 加载QML文件QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/ButtonExample.qml")));// 在QML中注册自定义的C++类型if (engine.rootObjects().isEmpty()){return -1;}// 创建C++对象// MyCppObject myCppObject;// 将C++对象注册到QML引擎中// engine.rootContext()->setContextProperty("myCppObject", &myCppObject);return app.exec();
}

qml文件

// 写一个串口通信
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.0// 自定义的cpp(通过main.c注册进来)
import GenOsal 0.1Window {width: 640height: 480visible: truetitle: qsTr("test Connect")// 用来连接cpp的信号Connections{target: m_objectfunction onSigButtonClick(){console.log("recv button clicked");}}// 变量定义:var定义局部变量,只在当前QML文件中可用// property 定义对象属性的变量// let 定义常量,定义后不可以修改值Label{id: lab_comx: 0y: 0width: 120height: 50text: "端口号"color: "black"font.pixelSize: 18verticalAlignment: Text.AlignVCenterhorizontalAlignment: Text.AlignHCenterbackground: Rectangle {implicitWidth: 100implicitHeight: 40color: "red"border.color: "#26282a"border.width: 1radius: 4gradient: Gradient{GradientStop { position: 0.0; color: mouseArea.pressed ?  "white" : "lightgray"}GradientStop { position: 1.0; color: mouseArea.pressed ?  "lightgray" : "gray"}}}MouseArea {id: mouseAreaanchors.fill: parentonReleased: {// 直接调用函数m_object.handleButtonClick();}onPressed: {}onClicked: {console.log(edit_com.text);}}}Rectangle {// 设置部件的边距anchors.margins: {left:20}anchors.left: lab_com.righty: lab_com.ywidth: lab_com.widthheight: lab_com.heightborder.width: 1border.color: "gray"TextInput {id: edit_comanchors.fill: parent// enabled: bEnabledtext: "0"visible: truefont.pixelSize: 16focus: truehorizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenterinputMethodHints: Qt.ImhDigitsOnlyvalidator: IntValidator {top: 65535; bottom: 1}onFocusChanged: {// mainVKB.visible = true}}}MyCppObject{id: m_object}
}
3. 函数说明:
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);参数说明:
通过调用qmlRegisterType函数,可以将自定义的C++类型注册到QML中,从而可以在QML代码中使用该类型。在注册成功后,可以在QML中通过该类型的名称来创建该类型的实例,并调用其属性和方法。uri:表示注册类型的命名空间,通常为项目的名称或者公司的域名,用于区分不同的QML模块。通常是import的内容:例如:qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");import com.mycompany.qmlcomponents 1.0versionMajor:主版本号,用于指定注册类型的版本信息。versionMinor:次版本号,用于指定注册类型的版本信息。qmlName:表示要注册的类型在QML中的名称,可以在QML中直接使用该名称来创建该类型的实例。首字母大写C++注册方式2// 创建C++对象
MyCppObject myCppObject;
// 将C++对象注册到QML引擎中
engine.rootContext()->setContextProperty("myCppObject", &myCppObject);
4. qml 文件间的调用
命名:首字母大写
使用Load的方式调用问题较多,通常直接使用文件名来调用。
5. 界面布局

QML中布局一般有如下四种方式,

  1. 绝对坐标:x、y、z、width、height、
  2. 锚(anchors) 布局
  3. 定位器(Row、Column、Grid、Flow)
  4. 布局管理器(GridLayout、RowLayout、ColumnLayout)

锚布局:
这是一种相对位置关系的布局。特别说明margins是间距
在这里插入图片描述定位器:
spacing: 2 //相邻间距
Repeater 重复布局

import QtQuick 2.0
Row
{Repeater {model: 3Rectangle {width: 100; height: 40border.width: 1color: "yellow"}}
}
Row 水平布局
Column 垂直布局
Grid
Flow
布局管理器: 和Creator中一样cpp中的函数
void MyCppObject::handleButtonClick()
{qDebug() << "click";// 处理按键点击事件// ...// 发出自定义信号emit sigButtonClick();
}public slots:void handleButtonClick();
6. 代码举例

Label

 Label{property bool bEnable: falseproperty int nIndex: 1signal effective()signal clicksignal()id: lab_comx: 0y: 0width: 120height: 50text: "端口号"color: "black"font.pixelSize: 18verticalAlignment: Text.AlignVCenterhorizontalAlignment: Text.AlignHCenterbackground: Rectangle {implicitWidth: 100implicitHeight: 40color: "red"border.color: "#26282a"border.width: 1radius: 4gradient: Gradient{//颜色渐变GradientStop { position: 0.0; color: mouseArea.pressed ?  "white" : "lightgray"}GradientStop { position: 1.0; color: mouseArea.pressed ?  "lightgray" : "gray"}}}MouseArea {id: mouseAreaanchors.fill: parentonReleased: {bEnable = falseeffective()}onClicked: {clicksignal()}}
}

Textinput

    Rectangle {width: 178height: parent.heightcolor: bEnabled? "white" : "lightgray"border.width: 1border.color: "gray"TextInput {id: textDataanchors.fill: parentenabled: bEnabledtext: "0"visible: truefont.pixelSize: 16focus: truehorizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenterinputMethodHints: Qt.ImhDigitsOnlyvalidator: IntValidator {top: 65535; bottom: 1}onFocusChanged: {mainVKB.visible = true}}}
Text
Text {width: 100height: 15text: sLableDownfont.pixelSize: 14font.bold: truecolor: "black"horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter}

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

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

相关文章

【北京迅为】《iTOP龙芯2K1000开发指南》-第四部分 ubuntu开发环境搭建

龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

光伏无人机:巡检无人机解决巡检难题

随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;其中光伏无人机在解决光伏电站巡检难题方面发挥了重要作用。光伏无人机以其高效、精准、安全的特点&#xff0c;为光伏电站的巡检工作带来了革命性的变革。 光伏电站通常位于广阔的户外场地&#x…

webpack热更新原理详解

文章目录 前言基础配置创建项目HMR配置 HMR交互概览HMR流程概述HMR实现细节初始化注册监听编译完成事件启动服务监听文件代码变化服务端发送消息客户端收到消息热更新文件请求热更新代码替换 问题思考 前言 刷新分为两种&#xff1a;一种是页面刷新&#xff0c;不保留页面状态…

GPU深度学习环境搭建:Win10+CUDA 11.7+Pytorch1.13.1+Anaconda3+python3.10.9

1. 查看显卡驱动及对应cuda版本关系 1.1 显卡驱动和cuda版本信息查看方法 在命令行中输入【nvidia-smi】可以当前显卡驱动版本和cuda版本。 根据显示,显卡驱动版本为:Driver Version: 516.59,CUDA 的版本为:CUDA Version 11.7。 此处我们可以根据下面的表1 显卡驱动和c…

大模型咨询培训老师叶梓:利用知识图谱和Llama-Index增强大模型应用

大模型&#xff08;LLMs&#xff09;在自然语言处理领域取得了显著成就&#xff0c;但它们有时会产生不准确或不一致的信息&#xff0c;这种现象被称为“幻觉”。为了提高LLMs的准确性和可靠性&#xff0c;可以借助外部知识源&#xff0c;如知识图谱。那么我们如何通过Llama-In…

将阿里云中数据传输到其他超算服务器

目录 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync&#xff08;速度慢&#xff09; 方法2&#xff1a;rclone(速度很快&#xff0c;100G只花了大约20min) 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync/scp&#xff08;速度慢&#xff0…

网贷大数据黑名单要多久才能变正常?

网贷大数据黑名单是指个人在网贷平台申请贷款时&#xff0c;因为信用记录较差而被列入黑名单&#xff0c;无法获得贷款或者贷款额度受到限制的情况。网贷大数据黑名单的具体时间因个人信用状况、所属平台政策以及银行审核标准不同而异&#xff0c;一般来说&#xff0c;需要一定…

mac: docker安装及其Command not found: docker

已经安装了docker desktop&#xff0c;没安装的 点击安装 傻瓜式安装即可 接着打开终端&#xff1a;好一个 Comand not found:docker 看我不把你整顿&#xff0c;解决如下&#xff1a; 如果你在 macOS 上安装了 Docker Desktop&#xff0c;但是终端无法识别 docker 命令&…

微信搜一搜优化:今天你“搜一搜”了吗?

微信“搜一搜”功能的排名规则和机制是微信生态系统中非常重要的一部分&#xff0c;它决定了小程序、公众号、文章、直播等内容在搜索结果中的展示顺序。小柚给大家整理了一份对其排名规则和机制的详细解析&#xff1a; 首先&#xff0c;关键词匹配度是影响搜索结果排名的重要…

HashMap底层实现条分缕析

目录 题外话 正题 哈希表 哈希碰撞 HashMap底层实现 小结 题外话 又水了两天,怪我,在宿舍确实没什么状态,是时候调整调整了 正题 今天直接讲解HashMap底层实现 哈希表 哈希表又称散列表 是数组和单向链表的结合体 如下图 而哈希表存放元素机制是靠哈希函数解析关键…

Jira搭建过程

看到很多小伙伴对jira有兴趣,我们今天就来分享一下jira的搭建吧 首先要明白jira是什么? 看来搭建jira也是我们测试人员需要具备的技能之一了.下面是详细的大家步骤: 1.系统环境准备 Centos 7.5 Mysql 5.6 Java1.8 2.软件安装包 atlassian-jira-software-7.13.0-x64.bin …

Linux_环境变量

目录 1、查询所有环境变量 2、常见的环境变量 2.1 PATH 2.2 HOME 2.3 PWD 3、增加新的环境变量 4、删除环境变量 5、main函数的三个形参 5.1 argv字符串数组 5.2 env字符串数组 6、系统调用接口 6.1 getenv 6.2 putenv 7、全局变量environ 结语 前言&…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

中颖51芯片学习9. PWM(12bit脉冲宽度调制)

中颖51芯片学习9. PWM&#xff08;12bit脉冲宽度调制&#xff09; 一、资源简介二、PWM工作流程三、寄存器介绍1. PWMx控制寄存器PWMxCON2. PWM0周期寄存器PWM0PH/L3. PWM1周期寄存器PWM1PH/L4. PWM0占空比控制寄存器PWM0DH/L5. PWM1占空比控制寄存器 PWM1DH/L6. 占空比寄存器与…

跨语言指令调优深度探索

目录 I. 介绍II. 方法与数据III. 结果与讨论1. 跨语言迁移能力2. 问题的识别3. 提高跨语言表现的可能方向 IV. 结论V. 参考文献 I. 介绍 在大型语言模型的领域&#xff0c;英文数据由于其广泛的可用性和普遍性&#xff0c;经常被用作训练模型的主要语料。尽管这些模型可能在英…

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天&#xff0c;ESLint迎来了一次重大更新&#xff0c;9.0.0版本&#xff0c;根据官方文档介绍&#xff0c;使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0&#xff0c;或者是>21.1.0的版本&#xff0c;新版ESLint将不再直接支持以下旧版配置(非扁平化…

二、OSPF协议基础

基于SPF算法&#xff08;Dijkstra算法&#xff09;的链路状态路由协议OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09; 目录 1.RIP在大型网络中部署所面临的问题 2.Router ID 3.OSPF的报文 4.OSPF邻居建立过程 5.OSPF报文的确认机制…

SAP的生成式AI

这是一篇openSAP中关于SAP生成式AI课程的笔记,原地址https://open.sap.com/courses/genai1/ 文章目录 Unit 1: Approaches to artificial intelligence概念三种范式监督学习非监督学习强化学习Unit 2: Introduction to generative AI生成式AI基础模型关系基础模型有哪些能力呢…

怎么通过isinstance(Obj,Class)验证?【isinstance】

最近有这样一个项目&#xff0c;这个项目可以用一个成熟的项目的构造树&#xff0c;读取树&#xff0c;再检索的过程&#xff0c;现在有新的需求&#xff0c;另一个逻辑构造同样节点结构的树&#xff0c;pickle序列化保存&#xff0c;再使用原来项目的读取、检索函数&#xff0…

一年期免费SSL证书申请方法

免费SSL证书的申请已经成为当今互联网安全实践中的重要环节&#xff0c;它不仅有助于保护网站数据传输的隐私性和完整性&#xff0c;还能提升用户信任度&#xff0c;因为现代浏览器会明确标识出未使用HTTPS&#xff08;即未部署SSL证书&#xff09;的网站为“不安全”。以下是一…