【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录

什么是QT

特点 

QT程序 

main函数

QT按钮

纯代码模式

图形化模式 

对象树模型

信号和槽 

连接与断开

自动连接

 断开连接

信号的发射 

lambda表达式 

基本语法 

捕获列表 

Lambda表达式用于信号与槽的连接

 例如


 

什么是QT

Qt是一个跨平台的C++图形用户界面应用程序框架

在QT中,一个函数对应着一个相对应的头文件,文件和函数名相同;

当然了,有的头文件也会隐式包含了其它头文件,所以有些函数不需要特意去包含相对应的头文件 

特点 

  • 跨平台,几乎支持所有的平台
  • 接口简单,容易上手,学习QT框架对学习其他框架有参考意义。
  • 一定程度上简化了内存回收机制
  • 开发效率高,能够快速的构建应用程序。
  • 有很好的社区氛围,市场份额在缓慢上升。
  • 可以进行嵌入式开发。 

QT程序 

main函数

QT按钮

QT控件的创建,一般有两种方式:

  • 通过图形化的方式,在界面上创建出一个控件,显示设置文本。
  • 通过纯代码的方式,通过编写代码,在界面上创建控件,显示设置文本。

纯代码模式

通过代码创建按钮,指定挂到对象树上,方便日后的资源释放

通过按钮对象来调用不同的方法函数来实现不同功能

 

        如果只是创建出对象,是无法显示到窗口中的,所以我们需要依赖一个父窗口,也就是指定一个父亲。(按钮也是继承于QWidget,也属于窗口)。 

图形化模式 

用图形化模式创建一个按钮,只需要在ui文件内,选择需要的控件拖拽到窗口区即可。

当然,后续还可以添加qrc文件来达到更好的效果。

 

对象树模型

 在Qt中,当一个对象被创建时,可以指定其父对象。

QObject是Qt里边绝大部分类的根类

QObject对象之间是以对象树的形式组织起来的。

  •  当两个QObject(或子类)的对象建立了父子关系的时候。子对象就会加入到父对象的一个成员变量叫children(孩子)的list(列表)中。
  • 当一个父对象被销毁时,它的所有子对象也会被自动销毁,从而释放它们占用的资源。

        对象树确保的是先释放⼦节点的内存, 后释放⽗节点的内存. ⽽析构函数的调⽤顺序则不⼀定遵守上述要求. 因此看到⼦节点的析构执⾏顺序反⽽在⽗节点析构顺序 之后.

注: 调⽤析构函数和释放内存并⾮是同⼀件事。

信号和槽 

信号和槽是实现对象间通信的一种机制;

对象在发生信号后,另一个对象可以连接信号到自己的槽函数上,响应。

信号(signals):

  • 信号是Qt中的一种特殊函数,它在特定事件发生时被发射(emit)。
  • 信号可以携带参数,这些参数在信号发射时传递给连接的槽函数。

槽(Slots):

  • 槽是Qt中的一种特殊成员函数,可以连接到信号上。
  • 槽函数可以有参数,也可以没有参数。如果有参数,这些参数必须与连接的信号的参数匹配。

连接与断开

自动连接

信号和槽是自动连接的;

两种方式连接:

  • 在Qt Designer中,可以通过拖动信号到槽来自动创建连接。
  • 也可以在代码中使用 QObject::connect 函数来手动创建连接。

 

 断开连接

使用 QObject::disconnect 函数来断开信号和槽之间的连接。
断开连接可以防止槽函数在不需要的时候被调用。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信号源是 图形化按钮         关闭后               谁来处理       怎么处理connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked);
}
//手动添加 处理图形化pushbutton1槽函数
void Widget::handclicked()
{this->setWindowTitle("标题修改成标题1");qDebug()<<"handclicked1";
}void Widget::handclicked2()
{//切换原来槽信号后,this->setWindowTitle("标题修改为2");qDebug()<<"handclicked2";
}void Widget::on_pushButton_2_clicked()
{//1.先断开pushButton原来的 信号槽//如果没有 disconnect, 就会构成 一个信号绑定了两个槽函数. 触发信号的时候, 两个槽函数都会执行.disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked);//2.重新绑定信号槽connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked2);
}

信号的发射 

信号的发射是通过调用 emit 关键字实现的。

// myclass.hsignals: // 信号声明部分void mySignal(int value); // 自定义信号,参数为int类型
// myclass.cpp
#include "myclass.h"void MyClass::someMethod()
{int value = 10;emit mySignal(value); // 发射信号,并传递一个int值
}
#include <QApplication>
#include "myclass.h"class Receiver : public QObject
{Q_OBJECTpublic slots:void receiveValue(int value) // 对应的槽函数{qDebug() << "Received value:" << value;}
};

lambda表达式 

  C++11中的Lambda表达式用于定义匿名的函数对象,以简化编程工作。

基本语法 

[捕获列表](参数列表) -> 返回类型 { 函数体 }

[capture-list] (parameters) -> return-type { body; }
  • capture-list(捕获列表): 定义了lambda函数体中可以访问的外部变量。可以是空的,或者使用[&]捕获所有外部变量的引用,[=]捕获所有外部变量的值,或者明确指定个别变量,如[x, &y]表示按值捕获x,按引用捕获y。
  • parameters(参数列表): 类似于常规函数的参数列表,可以为空。
  • -> return-type(返回类型): 可选,明确指定lambda函数的返回类型。如果不写,则编译器会根据函数体推导返回类型。
  • body(函数体): 包含了lambda表达式执行的具体代码。 

捕获列表 

 [=]:以传值方式捕获所有局部变量。
[&]:以引用方式捕获所有局部变量。
[变量]:捕获特定变量,可以使用=或&指定捕获方式。

Lambda表达式用于信号与槽的连接

QObject::connect(sender, &SenderClass::signalName, [=]() {// Lambda表达式内的代码
});
 例如
#include "widget.h"
#include "ui_widget.h"#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//lanbda的使用QPushButton* button = new QPushButton(this);button->setText("按钮");button->move(200,200);//链接connect(button,&QPushButton::clicked,this,[=](){qDebug()<<"lambda被执行";this->setWindowTitle("我是窗口标题");this->move(100,100);});
}

 

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

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

相关文章

办理河南公司企业信用等级3A证书流程和条件

企业信用等级3A证书属于一种荣誉资质&#xff0c;是提升企业公信力和影响力保障的一项资质。信用等级是信用 (资信)评估机构根据企业资信评估结果对企业信用度划分的等级类别&#xff0c;它反映了企业信用度的高低。AAA信用等级是一种等级划分。代指企业的信用经过行业、机构评…

零成本搭建个人图床服务器

前言 图床服务器是一种用于存储和管理图片的服务器&#xff0c;可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片&#xff0c;就可以集中放到图床里&#xff0c;既方便多平台文章发布&#xff0c;又能统一管理和备份。 当然下面通过在 Git…

中药材图像识别:中医与深度学习的融合(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 一、引…

flink的窗口

目录 窗口分类 1.按照驱动类型分类 1. 时间窗口&#xff08;Time window&#xff09; 2.计数窗口&#xff08;Count window&#xff09; 2.按照窗口分配数据的规则分类 窗口API分类 API调用 窗口分配器器&#xff1a; 窗口函数 增量聚合函数&#xff1a; 全窗口函数…

MySQL高级-MVCC-原理分析(RC级别)

文章目录 1、RC隔离级别下&#xff0c;在事务中每一次执行快照读时生成ReadView2、先来看第一次快照读具体的读取过程&#xff1a;3、再来看第二次快照读具体的读取过程: 1、RC隔离级别下&#xff0c;在事务中每一次执行快照读时生成ReadView 我们就来分析事务5中&#xff0c;两…

VBA代码解决方案第十五讲:如何对单元格区域进行高亮显示

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

【操作系统期末速成】EP06 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点十四&#xff1a;同步互斥的基本概念2.2 考点十五&#xff1a;实现临界区互斥的基本方法2.3 考点十六&#xff1a;信号量的含义及常用信号量 一、前言&#x1f680;&#x1…

操作系统概论(二)

一、单项选择题(本大题共20小题&#xff0c;每小题1分&#xff0c;共20分) 在每小题列出的四个备选项中只有一个选项是符合题目要求的&#xff0c;请将其代码填写在题后的括号内。错选、多选或未选均无分。 1&#xff0e;操作员接口是操作系统为用户提供的使用计算机系统的手…

Vitis IDE 艰难切换--从传统 Vitis GUI 到 2024.1 统一软件界面

目录 1. 简介 2. 界面展示 2.1 启动 2.2 Flow Navigator 2.1.1 C Simulation Dialog 2.1.2 C Synthesis 2.1.3 C/RTL Co-simulation 2.1.4 Implementation 2.1.5 Package 3. C Synthesis 详解 3.1 Classic Configuration Settings 3.1.1 config_array_partition 3…

MySQL进阶:存储过程和函数

存储过程和函数 1. 简介2. 创建存储过程使用MySQL工作台创建存储过程 3. 删除存储过程4. 参数带默认值的参数参数验证输出参数 5. 变量6. 函数7. 其他约定 1. 简介 存储过程三大作用&#xff1a; 储存和管理SQL代码&#xff08;置于数据库中&#xff0c;与应用层分离&#xf…

快递物流仓库管理系统java项目springboot和vue的前后端分离系统java课程设计java毕业设计

文章目录 快递物流仓库管理系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 快递物流仓库管理系统 一、项目演示 快递物流仓库管理系统 二、项目介绍 语言: Java 数据库&#xff1a;MySQL 前…

宝塔安装rabbitMQ实战

服务器环境说明 阿里云服务器、宝塔、centos7 一、下载erlang 原因&#xff1a;RabbitMQ服务端代码是使用并发式语言Erlang编写的&#xff0c;安装Rabbit MQ的前提是安装Erlang。 下载地址&#xff1a;http://www.erlang.org/downloads 下载对应的版本&…

山东省著名烈士孙善师孙善帅故居布展喜添新篇

人海信息网山东讯&#xff08;张春兄、冯爱云&#xff09; “……他们以钢铁般的意志&#xff0c;坚守共产党员的使命&#xff0c;他们就是泺口九烈士的孙善师孙善帅兄弟&#xff01;”6月28日&#xff0c;对于山东省著名烈士孙善师孙善帅故居来说&#xff0c;又是一个不平凡的…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

AI论文速读 | 2024[KDD]自适应时空图神经网络中图中奖彩票的预训练识别

题目&#xff1a;Pre-Training Identification of Graph Winning Tickets in Adaptive Spatial-Temporal Graph Neural Networks 作者&#xff1a;Wenying Duan, Tianxiang Fang, Hong Rao, Xiaoxi He 机构&#xff1a;南昌大学&#xff0c;澳门大学 arXiv网址&#xff1a;h…

Python数据分析-股票分析和可视化(深证指数)

一、内容简介 股市指数作为衡量股市整体表现的重要工具&#xff0c;不仅反映了市场的即时状态&#xff0c;也提供了经济健康状况的关键信号。在全球经济体系中&#xff0c;股市指数被广泛用于预测经济活动&#xff0c;评估投资环境&#xff0c;以及制定财政和货币政策。在中国…

IEEE JSTSP综述:从信号处理领域分析视触觉传感器的研究

触觉传感器是机器人系统的重要组成部分&#xff0c;虽然与视觉相比触觉具有较小的感知面积&#xff0c;但却可以提供机器人与物体交互过程中更加真实的物理信息。 视觉触觉传感是一种分辨率高、成本低的触觉感知技术&#xff0c;被广泛应用于分类、抓取、操作等领域中。近期&a…

如何跑起来一个前后端项目

后端部署 第一步配置自己的maven 第二步优先导入自己本地jar包当本地没有在从远程下载 第三步找到配置文件 第四步成功运行后端部署完毕 前端部署 第一步看看项目node_modules有没有文件如果有就是已经安装好了对应的依赖&#xff0c;没有执行npm install 第二步运行即可

决策树划分属性依据

划分依据 基尼系数基尼系数的应用信息熵信息增益信息增益的使用信息增益准则的局限性 最近在学习项目的时候经常用到随机森林&#xff0c;所以对决策树进行探索学习。 基尼系数 基尼系数用来判断不确定性或不纯度&#xff0c;数值范围在0~0.5之间&#xff0c;数值越低&#x…

【知识学习】Unity3D中Scriptable Render Pipeline的概念及使用方法示例

Unity3D中的Scriptable Render Pipeline&#xff08;SRP&#xff09;是一种高度可定制的渲染管线框架&#xff0c;允许开发者完全控制渲染流程&#xff0c;以适应不同的渲染需求和硬件平台。SRP使得开发者可以编写自己的渲染逻辑&#xff0c;包括摄像机管理、渲染设置、光照处理…