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_OBJECT

public:
    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.1

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("test Connect")

    // 用来连接cpp的信号
    Connections{
        target: m_object

        function onSigButtonClick(){
            console.log("recv button clicked");
        }
    }
    // 变量定义:var定义局部变量,只在当前QML文件中可用
    // property 定义对象属性的变量
    // let 定义常量,定义后不可以修改值
    Label{
        id: lab_com
        x: 0
        y: 0
        width: 120
        height: 50
        text: "端口号"
        color: "black"
        font.pixelSize: 18
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter
        background: Rectangle {
            implicitWidth: 100
            implicitHeight: 40
            color: "red"
            border.color: "#26282a"
            border.width: 1
            radius: 4
            gradient: Gradient{
                GradientStop { position: 0.0; color: mouseArea.pressed ?  "white" : "lightgray"}
                GradientStop { position: 1.0; color: mouseArea.pressed ?  "lightgray" : "gray"}
            }
        }
        MouseArea {
            id: mouseArea
            anchors.fill: parent
            onReleased: {
                // 直接调用函数
                m_object.handleButtonClick();
            }
            onPressed: {
            }
            onClicked: {
                console.log(edit_com.text);
            }
        }
    }

    Rectangle {
        // 设置部件的边距
        anchors.margins: {
            left:20
        }
        anchors.left: lab_com.right
        y: lab_com.y
        width: lab_com.width
        height: lab_com.height
        border.width: 1
        border.color: "gray"

        TextInput {
            id: edit_com
            anchors.fill: parent
            // enabled: bEnabled
            text: "0"
            visible: true
            font.pixelSize: 16
            focus: true
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
            inputMethodHints: Qt.ImhDigitsOnly
            validator: 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.0
	versionMajor:主版本号,用于指定注册类型的版本信息。
	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: 3
        Rectangle 
        {
            width: 100; height: 40
            border.width: 1
            color: "yellow"
        }
    }
}
Row 水平布局
Column 垂直布局
Grid
Flow
布局管理器: 和Creator中一样

cpp中的函数
void MyCppObject::handleButtonClick()
{
    qDebug() << "click";
    // 处理按键点击事件
    // ...

    // 发出自定义信号
    emit sigButtonClick();
}

public slots:
    void handleButtonClick();
6. 代码举例

Label

 Label{
	property bool bEnable: false
	property int nIndex: 1
	signal effective()
	signal clicksignal()
	
	id: lab_com
	x: 0
	y: 0
	width: 120
	height: 50
	text: "端口号"
	color: "black"
	font.pixelSize: 18
	verticalAlignment: Text.AlignVCenter
	horizontalAlignment: Text.AlignHCenter

	background: Rectangle {
	    implicitWidth: 100
	    implicitHeight: 40
	    color: "red"
	    border.color: "#26282a"
	    border.width: 1
	    radius: 4
	    gradient: Gradient{//颜色渐变
	        GradientStop { position: 0.0; color: mouseArea.pressed ?  "white" : "lightgray"}
	        GradientStop { position: 1.0; color: mouseArea.pressed ?  "lightgray" : "gray"}
	    }
	}
	MouseArea {
	    id: mouseArea
	    anchors.fill: parent
	    onReleased: {
	        bEnable = false
	        effective()
	    }
	    onClicked: {
	        clicksignal()
	    }
	}
}

Textinput

    Rectangle {
        width: 178
        height: parent.height
        color: bEnabled? "white" : "lightgray"
        border.width: 1
        border.color: "gray"

        TextInput {
            id: textData
            anchors.fill: parent
            enabled: bEnabled
            text: "0"
            visible: true
            font.pixelSize: 16
            focus: true
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
            inputMethodHints: Qt.ImhDigitsOnly
            validator: IntValidator {top: 65535; bottom: 1}
            onFocusChanged: {
                mainVKB.visible = true
            }
        }
    }
Text
Text {
     width: 100
     height: 15
     text: sLableDown
     font.pixelSize: 14
     font.bold: true
     color: "black"
     horizontalAlignment: Text.AlignHCenter
     verticalAlignment: Text.AlignVCenter
 }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编译工具各版本与操作系统版本号兼容性冷知识 : JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号的兼容情况

编译工具各版本与操作系统版本号兼容性冷知识 &#x1f9e0;: JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号的兼容情况 文章目录 编译工具各版本与操作系统版本号兼容性冷知识 &#x1f9e0;: JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号…

探索UTONMOS《神念无界-源起山海》元宇宙游戏的奇幻世界

在科技的前沿&#xff0c;元宇宙游戏如同一扇神秘的大门&#xff0c;缓缓开启&#xff0c;引领我们进入一个前所未有的奇幻世界。 UTONMOS《神念无界-源起山海》元宇宙游戏是数字世界的巅峰之作&#xff0c;它打破了现实与虚拟的界限&#xff0c;让玩家能够身临其境地体验各种奇…

二分查找-在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 输入&#xf…

职场不败的社交口才是什么行为

职场不败的社交口才是什么行为 职场不败的社交口才&#xff1a;塑造卓越人际关系的行为艺术 在职场中&#xff0c;社交口才是一项至关重要的能力。它不仅能够帮助我们建立良好的人际关系&#xff0c;更能在关键时刻为我们赢得信任、提升影响力&#xff0c;从而在职场竞争中立于…

HR招聘,怎么做人才测评方案?

一个完整的人才测评环节&#xff0c;离不开对方案的合理设计&#xff0c;更离不开对方案的具体执行。人才测评方案&#xff0c;能够在很大程度上帮助人力资源工作者减轻负担&#xff0c;从繁琐的招聘工作中得到解脱&#xff0c;不再跟陀螺一样转个不停。只有具备合理的人才测评…

Java中的Collection集合

关于集合的介绍 集合分为Collection集合和Map集合&#xff08;Collection集合是单列集合和Map集合双列集合&#xff09;Collection和Map都为接口 Collection集合又分为List集合&#xff08;集合元素可重复&#xff09;和Set集合&#xff08;集合元素不可重复 &#xff09;Lis…

免费ChatGPT合集——亲测免费

1、YesChat 无需登录 网址&#xff1a;YesChat-ChatGPT4V Dalle3 Claude 3 All in One Freehttps://www.yeschat.ai/ 2. 讯飞星火 要登录 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 3.通义千问 要登录 通义我是通义&#xff0c;一个专门响应人类指令的…

Linux快速部署大语言模型LLaMa3,Web可视化j交互(Ollama+Open Web UI)

本文在个人博客同步发布&#xff0c;前往阅读 1 介绍 本文将介绍使用开源工具Ollama(60.6k⭐)部署LLaMa大模型&#xff0c;以及使用Open WebUI搭建前端Web交互界面的方法。 我们先来过一遍几个相关的概念&#xff0c;对这块比较熟悉的朋友可跳过。 1.1 大规模语言模型 大规…

【我的Java学习笔记-2】

程序初体验 JDK的安装目录 bin&#xff1a;该路径下存放了各种工具命令。其中比较重要的有:javac和java&#xff08;重点掌握&#xff09;conf&#xff1a;该路径下存放了相关配置文件。include&#xff1a;该路径下存放了一些平台特定的头文件。jmods&#xff1a;该路径下存…

亿道三防onerugged|三防车载电脑在港口货柜车上的应用

作为一个专业人员&#xff0c;我深知在港口货柜车运输中&#xff0c;三防车载电脑的应用对于提高工作效率和解决实际问题的重要性。亿道三防onerugged系列产品的三防车载电脑以其卓越的功能特点和可靠性&#xff0c;为港口货柜车运输带来了深远的影响。 首先&#xff0c;三防车…

BUUCTF--web(1)

1、[极客大挑战 2019]Http1 1.http报文请求&#xff1a; 1、请求行&#xff1a; 第一部分是请求方法&#xff0c;常见包括GET、POST、OPTIONS&#xff08;我目前还没有见过我是菜鸡&#xff09; 第二部分是url 第三部分是HTTP协议(http(Hypertext transfer protocol)超文本传…

c++多文件,cmakelist编写简单示例

记录下c多文件cmakelist编写流程&#xff1a; 目录结构大致如下&#xff1a; 1、swap.h #include <iostream> #include <vector> #include <string> using namespace std;void swap(int *a,int *b); 2、swap.cpp #include "swap.h"void swap(…

【Linux学习】​​学习Linux的准备工作和Linux的基本指令

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

iOS - 多线程-读写安全

文章目录 iOS - 多线程-读写安全1. 多读单写1.1 场景1.2 实现方案1.2.1 pthread_rwlock&#xff1a;读写锁1.2.1.1 示例 1.2.2 dispatch_barrier_async&#xff1a;异步栅栏调用1.2.2.1 示例 iOS - 多线程-读写安全 假设有一个文件&#xff0c;A线程进行读取操作&#xff0c;B…

【Linux】基础指令

文章目录 基础指令1. pwd 指令2. cd 指令3. ls 指令4. touch 指令5. mkdir 指令6. rmdir 和 rm 指令7. man 指令8. cp 指令9. mv 指令10. cat 指令11. more 和 less 指令12. head 和 tail 指令13. date 指令14. cal 指令15. find 指令16. grep 指令18. zip 和 unzip 指令19. ta…

Unity打开Android文件管理器并加载文件

1、在AssetStore商店中加入免费插件 2、调用代码 3、使用UnityWebRequest加载路径数据

RabbitMQ(高级)笔记

一、生产者可靠性 &#xff08;1&#xff09;生产者重连&#xff08;不建议使用&#xff09; logging:pattern:dateformat: MM-dd HH:mm:ss:SSSspring:rabbitmq:virtual-host: /hamllport: 5672host: 192.168.92.136username: hmallpassword: 123listener:simple:prefetch: 1c…

【问题实操】银河高级服务器操作系统实例分享,配置hugepages启动异常

1.问题现象 某运营商国产服务器操作系统项目&#xff0c;部署Kylin-Server-0524-aarch64服务器系统&#xff0c;内核从4.19.90-24.4升级到4.19.90-25.14。在grub中配置huagepages大页内存后&#xff0c;系统在内核启动阶段黑屏&#xff0c;只显示一个光标。grub配置如下图&…

Springboot+Vue项目-基于Java+MySQL的商业辅助决策系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现 MobileNetV4 - Universal Models for the Mobile Ecosystem PDF: https://arxiv.org/pdf/2404.10518.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: ht…