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.hqwc.cn/news/652744.html

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

相关文章

node.js egg.js

Egg 是 Node.js 社区广泛使用的框架&#xff0c;简洁且扩展性强&#xff0c;按照固定约定进行开发&#xff0c;低协作成本。 在Egg.js框架中&#xff0c;ctx 是一个非常核心且常用的对象&#xff0c;全称为 Context&#xff0c;它代表了当前 HTTP 请求的上下文。ctx 对象封装了…

无人机探测技术,无人机侦测频谱仪技术实现详解

频谱仪&#xff0c;又称为频谱分析仪&#xff0c;是一种用于测量电信号频谱特性的仪器。其基本原理是通过将时域信号转换为频域信号&#xff0c;进而分析信号的频率成分、功率分布、谐波失真等参数。频谱仪利用快速傅里叶变换&#xff08;FFT&#xff09;算法&#xff0c;将采集…

Blender基础操作

1.移动物体&#xff1a; 选中一个物体&#xff0c;按G&#xff0c;之后可以任意移动 若再按X&#xff0c;则只沿X轴移动&#xff0c;同理可按Y与Z 2.旋转物体&#xff1a; 选中一个物体&#xff0c;按R&#xff0c;之后可以任意旋转 若再按X&#xff0c;则只绕X轴旋转&…

学习笔记:Vue2高级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 7.…

Redis缓存问题:穿透,击穿,雪崩等

Redis缓存问题:穿透,击穿,雪崩等 在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用redis来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的redis缓存问题. 缓存击穿 …

[滴水逆向三期] 在代码空白区添加代码

思路 把MessageBox()函数的机器码添加到第一个节的空白区&#xff0c;修改程序的入口点&#xff0c;使程序先执行MessageBox()函数在屏幕上显示一个弹窗&#xff0c;然后在jmp回原来的入口点&#xff0c;运行原来程序。 要添加的内容 6A 00 6A 00 6A 00 6A 00 E8 XX XX XX XX…

如何基于Spring Boot项目从零开始打造一个基于数据库号段模式去中心化的分布式ID生成方案

一、前言 在当前系统开发过程中&#xff0c;单体架构的应用正在走向消亡&#xff0c;越来越多的应用开始分布式架构&#xff0c;在分布式架构设计过程中&#xff0c;有一个问题往往避免不了&#xff0c;就是分布式ID生成问题。 在常见解决方案中&#xff0c;有使用雪花算法或…

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题&#xff0c;从而导致线材浪费甚至整根线材报废的问题&#xff0c;这基本都是由于人工测量长度所导致的&#xff0c;因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能&#xff0c;Electrical 3D布线能…

Open-Sora:开源版的Sora

项目简介 本项目希望通过开源社区的力量复现Sora&#xff0c;由北大-兔展AIGC联合实验室共同发起&#xff0c;当前我们资源有限仅搭建了基础架构&#xff0c;无法进行完整训练&#xff0c;希望通过开源社区逐步增加模块并筹集资源进行训练&#xff0c;当前版本离目标差距巨大&…

GNU Radio之Schmidl Cox OFDM synch.底层C++实现

文章目录 前言一、Schmidl & Cox 同步模块二、C 源码分析三、处理流程1、延迟路径&#xff08;Delay Path&#xff09;2、能量路径&#xff08;Energy Path&#xff09;3、频率估计&#xff08;Fine Frequency Estimate&#xff09;4、峰值检测&#xff08;Peak Detect&…

Git泄露和hg泄露原理理解和题目实操

一.Git泄露 1.简介 Git是一个开源的分布式版本控制系统&#xff0c;它可以实现有效控制应用版本&#xff0c;但是在一旦在代码发布的时候&#xff0c;存在不规范的操作及配置&#xff0c;就很可能将源代码泄露出去。那么&#xff0c;一旦攻击者发现这个问题之后&#xff0c;就…

并并并并·病查坤

P1、什么是并查集 引用自百度百科&#xff1a; 并查集&#xff0c;在一些有N个元素的集合应用问题中&#xff0c;我们通常是在开始时让每个元素构成一个单元素的集合&#xff0c;然后按一定顺序将属于同一组的元素所在的集合合并&#xff0c;其间要反复查找一个元素在哪个集合…