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.rhkb.cn/news/314450.html

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

相关文章

数字IC后端先进工艺设计实现之TSMC 12nm 6Track工艺数字IC后端实现重点难点盘点

大家知道咱们社区近期TSMC 12nm ARM Cortexa-A72(1P9M 6Track Metal Stack)已经开班。这里小编要强调一点:不要认为跑了先进工艺的项目就会很有竞争力&#xff01;如果你仅仅是跑个先进工艺的flow&#xff0c;不懂先进工艺在数字IC后端实现上的不同点&#xff0c;为何有这样的不…

【笔记】应对Chrome更新导致Chromedriver失效的解决方案:Chrome For Test

随着网络应用和网站的不断发展&#xff0c;自动化测试变得越来越重要&#xff0c;而Selenium成为了许多开发者和测试人员的首选工具之一。然而&#xff0c;对于使用Selenium来进行网站测试的人来说&#xff0c;Chrome浏览器的频繁更新可能会成为一个头疼的问题。每当Chrome更新…

论文速览 | IEEE TIFS, 2021 | 对车载毫米波雷达的物理层攻击及其防御方法的研究

注1:本文系"计算成像最新论文速览"系列之一,致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Science & Applications, Optica 等)。 本次介绍的论文是:<2…

iOS——NSCache

什么是NSCache NSCache是Foundation框架中的一个类&#xff0c;用于在iOS和macOS应用程序中进行临时性的内存缓存。它提供了一种轻量级的缓存机制&#xff0c;可以用于存储临时性的数据&#xff0c;例如图片、对象等。NSCache的主要特点和用法包括&#xff1a; 临时性缓存&…

汽车纵染压制专用液压机比例阀放大器

汽车纵染压制专用液压机比例阀放大器是一种专门用于汽车纵梁拉伸工艺的设备&#xff0c;它也可以用于其他金属薄板的压制成型及校正工艺。该类型的液压机通常具备独立的动力机构和电气系统&#xff0c;采用PLC技术进行控制&#xff0c;以确保操作的准确性和稳定性。除了纵梁拉伸…

openEuler-22.03安装redis6.2.7

前言&#xff1a;redis一开始是安装5.0.7&#xff0c;一直安装失败 gcc安装版本是 10.3.1 make报错 参考博客&#xff1a;https://blog.51cto.com/flyfish225/10596050 将redis版本换成 6.2.7 1、下载地址 https://download.redis.io/releases/redis-6.2.7.tar.gz 2、解压…

OpenHarmony硬件合成方案解析

本文档主要讲解在OpenHarmony中&#xff0c;硬件合成适配的方法及原理说明。 环境说明&#xff1a; OHOS版本&#xff1a;3.1-Release及以上 一、背景介绍 1.1 什么是合成 要理解什么是合成&#xff0c;合成做了什么&#xff1f;我们先通过分解设置界面来回答这个问题: 在…

删除二叉搜索树中的节点

题目链接 删除二叉搜索树中的节点 题目描述 注意点 节点值唯一root 是合法的二叉搜索树节点数的范围 [0, 10000] 解答思路 可以根据二叉搜索树的性质找到要删除的节点&#xff0c;关键是删除节点后怎么重新构建成一棵新的二叉搜索树首先要找到的是删除节点node的父节点nod…

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源&#xff1a;极客邦科技 自 2023 年上半年起&#xff0c;ChatGPT 等大模型技术蓬勃发展&#xff0c;AI 技术不断突破边界&#xff0c;展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统&#xff0c;到如今的深度学习、神经网络&#xff0c; AI 技术显著缩小了科学…

【webrtc】Chrome和Firefox在SDP协商过程中,针对localhost的不同处理

内网下chrome端webrtc协商失败 现象 我有一个webrtc服务器在局域网内&#xff0c;使用chrome浏览器访问时&#xff0c;发现webrtc在做媒体协商时失败。 具体表现是&#xff0c;在交换sdp后&#xff0c;ice的状态是oniceconnectionstatechange: failed 但是换成Firefox浏览器…

编写Spark独立应用程序

执行本文之前&#xff0c;先搭建好spark的开发环境&#xff0c;我目前只搭建了standalone模式&#xff0c;参考链接 &#xff1a; Spark Standalone模式部署-CSDN博客 1. 安装sbt 1&#xff09;下载sbt 网址&#xff1a;https://www.scala-sbt.org/download.html &#xff0c…

设计模式——终止模式之两阶段终止模式

文章目录 1. 错误思路2. 两阶段终止模式2.1 利用 isInterrupted2.2 利用停止标记interrupt-打断park Two Phase Termination 在一个线程 T1 中如何“优雅”终止线程 T2&#xff1f;这里的【优雅】指的是给 T2 一个料理后事的机会。 1. 错误思路 使用线程对象的 stop() 方法停…

论文解读-面向高效生成大语言模型服务:从算法到系统综述

一、简要介绍 在快速发展的人工智能&#xff08;AI&#xff09;领域中&#xff0c;生成式大型语言模型&#xff08;llm&#xff09;站在了最前沿&#xff0c;彻底改变了论文与数据交互的方式。然而&#xff0c;部署这些模型的计算强度和内存消耗在服务效率方面带来了重大挑战&a…

Xinlinx FPGA内的存储器BRAM全解

目录 一、总体概述1.7系列FPGA的BRAM特点2.资源情况 二、BRAM分类1.单端口RAM2.简单双端口RAM3.真双端口RAM 三、BRAM的读写1、Primitives Output Registers读操作注意事项2.三种写数据模式&#xff08;1&#xff09;Write_First&#xff08;2&#xff09;Read_First&#xff0…

【iconv】Linux c++ 中文字符串转十六进制 GBK 编码/内码

文章目录 问题描述c 代码CMakeLists.txt参考链接 问题描述 Linux 系统默认使用的是 UTF-8 编码&#xff0c;并且 c 中没有标准库可以直接将中文字符转为 GBK 编码/内码。因此需要借助 iconv 库来实现。 在实现代码之前&#xff0c;可以在一下在线工具网站进行中文字符到各个编…

mac上安装Tomcat

1. 简介 Tomcat 是一个开源的 Java 服务器&#xff0c;它实现了 Java Servlet、JavaServer Pages&#xff08;JSP&#xff09;和Java WebSocket 技术。Tomcat 是 Apache 软件基金会的一个项目&#xff0c;是一个轻量级、高性能的 Web 容器。作为一个 Web 服务器&#xff0c;To…

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版)

前端工程化Vue使用Node.js设置国内高速npm镜像源&#xff08;踩坑记录版&#xff09; 此篇仅为踩坑记录&#xff0c;并未成功更换高速镜像源&#xff0c;实际解决方法见文末跳转链接。 1.自身源镜像 自身镜像源创建Vue项目下载速度感人 2.更改镜像源 2.1 通过命令行配置 前提…

常见的排序算法

前言 算法对于我们普通的工程师来说可算得上陌生又熟悉&#xff0c;因为在平时的业务代码中可能见到他的身影比较少&#xff0c;但在底层的代码中我们可能会经常发现排序算法的影子&#xff0c;如数据库索引&#xff0c;操作系统的进程调度。因此&#xff0c;掌握这种算法中的…

打造智能语音机器人-用语音控制机器人

人工智能现已成为国家发展重大战略&#xff0c;智能语音技术作为人工智能产业链上的关键一环&#xff0c;AI应用成熟的技术之一&#xff0c;人工智能的发展也进入了一个崭新的阶段。那么打造智能语音机器人怎样实现用语音控制机器人呢&#xff1f;和小编一起来看看。 选择合适的…

Xcode for Mac:强大易用的集成开发环境

Xcode for Mac是一款专为苹果开发者打造的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了代码编辑器、编译器、调试器等一系列开发工具&#xff0c;让开发者能够在同一界面内完成应用的开发、测试和调试工作。 Xcode for Mac v15.2正式版下载 Xcode支持多种编程…