信号槽【QT】

server/2024/12/19 1:58:14/

文章目录

  • 对象树
  • 字符集
  • 信号槽
  • QT坐标系
  • 信号与槽
    • connect

对象树

#ifndef MYLABEL_H
#define MYLABEL_H#include<QLabel>
class MyLabel : public QLabel
{
public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWidget * parent);~MyLabel()  ;
};#endif // MYLABEL_H

上述代码,在 Qt 中不会产生内存泄露。

label 对象会在合适的时候被析构释放~~(虽然没有手动写 delete,确实能释放)

之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机 (窗口关闭/销毁)

把这些对象统一进行释放.

如果对象树的某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了

 #include "mylabel.h"
#include<iostream>
#include<QDebug>
MyLabel::MyLabel(QWidget * parent):QLabel(parent)
{}MyLabel::~MyLabel()
{//打印日志//会出现乱码//std::cout << "MyLabel 被销毁!" << std::endl;//QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。//直接使用 qDebug() 可以当做 cout来使用qDebug() << "MyLabel 被销毁!";
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

析构函数是执行了,虽然没有手动 delete,但是由于把 MyLabel 挂到了对象树上。此时窗口被销毁的时候,就会自动销毁对象树中的所有对象。MyLabel 的析构是执行了

解决乱码方案:
Qt 中提供了一个 qDebug() 工具,可以完成打印日志的过程。很好的处理字符编码

QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。
直接使用 qDebug() 这个东西就可以当做 cout 来使用。

使用 qDebug,打印的调试日志,是可以统一进行关闭的,qDebug 可以通过编译开关,来实现一键式关闭

字符集

出现乱码, 就是编码方式不匹配( 不局限于 C++)

如果字符串本身是 utf8 编码的,但是终端(控制台)是按照 gbk 的方式来解析显示的(拿着 utf8 这里的数值,去查询 gbk 的码表),就会出现乱码

用记事本方式来打开文件,将文件另存为,并查看文件字符集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示的是 UTF-8,说明这个文件就是 UTF-8 编码

显示的是 ANSI,说明这个文件就是 GBK 编码

信号槽

Qt 中的 connect 是 QObject 这个类提供的静态函数。这个函数的作用就是 “连接信号和槽”

在 Qt Designer 中创建一个控件时,此时就会给这个控件分配一个 objectName 属性。这个属性的值,要求是在界面中得是唯一的(不能重复)

QPushButton :

qmake 在预处理 .ui 文件的时候,就会根据这里的 objectName 生成对应的 C++ 代码。C++ 代码中该 QPushButton 对象的变量名字就是这里的 objectName。这个变量就是 ui 属性中的成员变量。

connect

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

widget.cpp

通过图形化界面的方式,实现的按钮版 hello world

此时按钮对象,不需要new , new 对象的操作已经是被 Qt 自动生成了
而且这个按钮对象,已经作为 ui 对象里的一个成员变量了。
也无需作为 Widget 的成员

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->myButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{//获取文本是hello Worldif(ui->myButton->text()  == QString("hello World")){// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello qt");}//获取文本不是hello Worldelse{// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello World");}
}

widget.cpp

纯代码方式实现Hello World

纯代码版本:

myButton按钮对象是new 的
为了保证其他函数中能够访问到这个变量,就需要把myButton按钮对象设定为 Widget 类的成员变量。

#include "widget.h"
#include "ui_widget.h"
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myButton = new QPushButton(this) ;myButton->setText("hello world") ;connect(ui->pushButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}void Widget::handleClick (){//检查myButton按钮的当前文本 是否为"hello world"if(myButton->text() == QString("hello world")){myButton->setText("hellp qt") ;}else{myButton->setText("hellp world") ; }}

QT坐标系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坐标系的原点 (0, 0) 就是屏幕的左上角 / 窗口的左上角

给 Qt 的某个控件,设置位置,就需要指定坐标。对于这个控件来说,坐标系原点就是相对于父窗口/控件的。

例如:

QPushButton 的父元素/父控件/父窗口 是 QWidget

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QWidget 没有父元素 (NULL),就相当于父元素就是整个显示器桌面了~~

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信号与槽

Qt 中,谈到信号,也是涉及到三个要素

信号源:由哪个控件发出的信号。

信号的类型:用户进行不同的操作,就可能触发不同的信号。

例如:点击按钮,触发点击信号。在输入框中移动光标,触发移动光标的信号。勾选一个复选框,选择一个下拉框,都会触发出不同的信号。

信号的处理方式:槽(slot),就是函数

Qt 中可以使用 connect 这样的函数,把一个信号和一个槽关联起来。后续只要信号触发了,Qt 就会自动的执行槽函数

槽函数,本质上也是一种"回调函数" (callback)

一定是先把信号的处理方式准备好,再触发信号

Qt 中,一定是先关联号信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了

connect

connect,这个函数和 Linux 中TCP的socket 中建立连接的函数,没有任何关系,只是名字恰巧一样了。

connect是 QObject 提供的静态的成员函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

connect(const QObject *sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection);

sender : 当前信号是哪个空间发出来的

signal : 信号的类型

receiver : 哪个对象(控件)负责处理

method: 这个对象如何处理 (要处理信号的对象提供的成员函数)

type : 很少使用,暂时不考虑


http://www.ppmy.cn/server/151316.html

相关文章

【计算机视觉】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 CVprojects 更新时间&#xff1a;2024-04-16 访问地址: GitHub 描述&#xff1a; computer vision projects | 计算机视觉相关好玩的AI项目&#xff08;Python、C、embedded system&…

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…

特工找密码(蓝桥杯)

本来这题想用枚举暴力解的&#xff0c;但是运行总是超时&#xff0c;数值范围太大了~&#xff0c;所以该题不能用枚举进行暴力。 转换成二进制&#xff0c;我们判断一下其规律 注意&#xff1a;按位与是都为1时其值才为1&#xff0c;所以当x和y按位与的结果为2时&#xff0c;其…

力扣--LCR 163.找到第K位数字

题目 某班级学号记录系统发生错乱&#xff0c;原整数学号序列 [1,2,3,4,…] 分隔符丢失后变为 1234… 的字符序列。请实现一个函数返回该字符序列中的第 k 位数字。 示例 1&#xff1a; 输入&#xff1a;k 5 输出&#xff1a;5 示例 2&#xff1a; 输入&#xff1a;k 12…

12.12 深度学习-卷积的注意力机制-通道注意力SENet

# 告诉模型训练的时候 对某个东西 给予额外的注意 额外的权重参数 分配注意力 # 不重要的就抑制 降低权重参数 比如有些项目颜色重要 有些是形状重要 # 通道注意力 一般都要比较多的通道加注意力 # SENet # 把上层的特征图 自动卷积为 1X1的通道数不变的特征图 然后给每一个…

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景&#xff1a;国产化升级&#xff0c;推动道路监控产业转型 随着国家对信息安全的重视&#xff0c;国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求&#xff0c;公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…

【JavaWeb后端学习笔记】WebSocket通信

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 主要应用场景&#xff1a;视频弹幕、网页聊天、体育实况更新、股票基金报价实时…

LabVIEW起落架震台检测

在现代飞机制造与维护过程中&#xff0c;起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统&#xff0c;通过模拟飞机着陆过程&#xff0c;准确捕捉起落架在着陆时承受的各种动力学特性和应力响应&#xff0c;有效提升起落架设计的精度与可靠…