qml和c++结合使用

news2025/2/26 19:08:38

目录

        • 文章简介
        • 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
 }

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

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

相关文章

本地Mysql开启远程访问(图文)

目录 1. 问题所示2. 原理分析3. 解决方法 1. 问题所示 事因是访问同事的数据库时&#xff0c;出现无法访问 出现1130 - Host ‘IT07’ is not allowed to connect to this MySQL server截图如下&#xff1a; 2. 原理分析 如果账号密码地址都正常的情况下&#xff0c;这是没开…

SQLite尽如此轻量

众所周知&#xff0c;SQLite是个轻量级数据库&#xff0c;适用于中小型服务应用等&#xff0c;在我真正使用的时候才发现&#xff0c;它虽然轻量&#xff0c;但不知道它却如此轻量。 下载 官网&#xff1a; SQLite Download Page 安装 1、将下载好的两个压缩包同时解压到一个…

基于springboot的高校宣讲会管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

前端工程化Vue使用Node.js永久设置国内高速npm镜像源

前端工程化Vue使用Node.js永久设置国内高速npm镜像源 接续上篇错误收录&#xff0c;此篇通过简单配置永久设置国内高速npm镜像源方法 1.更换新版镜像 清空npm缓存 npm cache clean --force修改回原版镜像源或直接删除配置过的镜像源 npm config set registry https://registr…

pve(Proxmox VE)安装i225v网卡驱动

配置pve源 备份原来的源 mv /etc/apt/sources.list /etc/apt/sources.list.bak打开文件 vi /etc/apt/sources.list将以下内容粘贴进去 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsing…

2024景区五一游园会活动策划方案

2024景区营地五一发酵面包市集主题游园会&#xff08;面包狂想曲主题&#xff09;活动策划方案-59P 方案页码&#xff1a;59页 文件格式&#xff1a;pptx 方案简介&#xff1a; 面包派对 如约而至 你有见过面包发酵的过程吗? 看着面团从手掌大小 不断膨胀到一倍、两倍、…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

校车车载4G视频智能监控系统方案

一、项目背景 随着社会的快速发展&#xff0c;校车安全问题日益受到人们的关注。为了提高校车运营的安全性&#xff0c;保障学生的生命安全&#xff0c;我们提出了一套校车车载4G视频智能监控系统方案。该系统能够实时监控校车内部和外部环境&#xff0c;及时发现并处理潜在的…

全志ARM-网络链接

命令扫描周围的WIFI热点 nmcli dev wifi 命令接入网络 nmcli dev wifi connect &#xff08;WiFi名&#xff0c;不要有空格&#xff09;password (WiFi密码) 查看IP地址 ip addr show wlan0或ifconfig 出现successfully就连接成功了

qt5core.dll怎么下载,qt5core.dll丢失能否修复?

qt5core.dll的丢失真是让人头疼。这个Visual C Redistributable for Visual Studio 2015的运行时库被许多程序和游戏所依赖&#xff0c;一旦缺失了qt5core.dll&#xff0c;就会面临无法打开程序或游戏&#xff0c;甚至系统崩溃等一系列问题。 qt5core.dll的消失会带来以下麻烦 …

沉浸式推理乐趣:体验线上剧本杀小程序的魅力

在这个信息爆炸的时代&#xff0c;人们的娱乐方式也在不断地推陈出新。其中&#xff0c;线上剧本杀小程序以其独特的沉浸式推理乐趣&#xff0c;成为了许多人的新宠。它不仅让我们在闲暇之余享受到了推理的快乐&#xff0c;更让我们在虚拟的世界里感受到了人性的复杂与多彩。 线…

可视化大屏对浅色系果断说“不”

可视化大屏拒绝浅色系的原因有以下几点&#xff1a; 对比度不足&#xff1a;浅色系在大屏上可能会导致对比度不足&#xff0c;使得数据和图表的展示不清晰&#xff0c;影响信息的传达和理解。可读性差&#xff1a;浅色系的文字和图表在大屏上可能会显得模糊不清&#xff0c;使…

有什么因素会影响IP稳定性?

IP稳定性指的是IP地址在一段时间内保持不变的能力&#xff0c;对于网络连接的安全性和可靠性至关重要。以下是一些可能影响IP稳定性的主要因素&#xff1a; 网络服务提供商&#xff08;ISP&#xff09;的政策&#xff1a;不同的ISP对于IP地址的管理和使用有不同的政策。一些IS…

使用 NVM 动态切node版本

一、安装nvm 官网链接&#xff1a; Release 1.1.9 coreybutler/nvm-windows GitHub 无脑安装直接下一步 安装完之后验证一下&#xff1a; #打开命令行输入命令 nvm 这样就是安装好了&#xff0c;然后我们开始安装node。 二、使用nvm安装node 1、去node官网获取版本号 …

2024年Q1季度洗衣机行业线上市场销售数据分析

Q1季度洗衣机线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;洗衣机累计销量约650万件&#xff0c;环比下降14%&#xff0c;同比下降14%&#xff1b;累计销售额约96亿元&#xff0c;环比下降30%&#…

Servlet和Tomcat运作过程

记录一下前后端请求交互过程&#xff08;不涉及Spring框架&#xff09;&#xff1a; 编写一个UserServlet 在web.xml文件中编写映射路径 编写前端

主题乐园私域精细化运营

主题乐园私域精细化运营是指在细分用户群体的基础上&#xff0c;通过个性化、精准的运营方式&#xff0c;为用户提供定制化服务和体验。以下是一些常见的主题乐园私域精细化运营玩法&#xff1a; 会员制度和会员专属服务&#xff1a;建立完善的会员制度&#xff0c;为会员提供专…

【linux】动静态库的使用与制作

本章节是基础IO的的最后一个话题!! 目录 浅谈一下动静态库&#xff1a;动静态库的制作与使用&#xff1a;静态库&#xff1a;怎么办&#xff1a;方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;方法四&#xff1a; 是什么&#xff1a;为什么&#xff1a; 动态库&#…

翻译《The Old New Thing》 - Never leave focus on a disabled control

Never leave focus on a disabled control - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040804-00/?p38243 Raymond Chen 2004年08月04日 在对话框管理中&#xff0c;一个大忌是禁用焦点所在的控件而不先将焦点移动到其他地方。 当你这…

浅析Free RTOS任务

目录 概述 1 FreeRTOS任务定义 2 任务函数实现 2.1 任务函数原型 2.2 顶层任务状态 2.3 任务优先级 3 任务状态的扩展 3.1 阻塞状态 3.2 挂起状态 3.3 就绪状态 4 空闲任务与空闲任务钩子函数 4.1 空闲任务 4.2 空闲任务钩子函数 4.2.1 钩子函数介绍 4.2.2 空闲…