初始QT——初入QT

7/3

客户端开发

直接由用户使用的这一端的开发,编写与客户交互的界面。

服务器开发

站在客户端背后的男人。

和客户交互的两种经典界面风格
1)命令行界面/终端界面 => TUI
2)图形化界面 => GUI
QT就是用来编写左面的GUI程序的一套框架。

Windows下还有哪些方案,可以开发GUI?

1.WindowsAPI  WIndows系统提供的原生API,开发起来原始且繁琐。
------[什么是API](https://blog.csdn.net/lph188/article/details/87979601)
2.MFC上个世纪的遗物
3.WindowsForm 给C#(.net)量身定做的GUI开发
4.Electron  本质是把基于HTML这样的网页,打包成一个Windows上运行的客户端程序。

什么是QT

QT是一个跨平台的C++图形用户界面应用程序框架。
(框架,本质上是一群大佬发明出来的,让我们写出的代码也比较靠谱。库,被程序员调用,程序员是主体,框架,则是自己占主体,程序员配合框架)

QT支持的系统

1)windows(各个版本)
2)Linux
3)Mac
4)嵌入式系统

QT的优点

1)跨平台,几乎支持所有的平台。
2)接口简单,容易上手,学习QT框架对学习其他框架有参考意义。
3)一定程度上简化了内存回收机制;
4)可以进行嵌入式开发;

QT的应用场景

1)桌面应用程序
2)移动应用程序
3)嵌入式系统

QT开发环境!!!!

QT开发环境,需要安装三个部分。
1)C++编译器.(gcc,cl.exe… 不是visual Studio)编译器!=IDE
2)Qt SDK
SDK=> 软件开发工具包
比如,Windows版本QT SDK已经内置了C++编译器。(内置的编译器是mingw,windows版本的gcc)
想用VS内置的 cl.exe需要配置额外的东西,容易出错。具体安装的过程中,需要把对应的C++编译器一起给勾上(mingw)
3)需要有一个Qt的集成开发环境(IDE)
1.Qt官方提供的Qt Creator

易上手,不需要额外配置,可能存在一些bug,适合初学者

Qt使用的小工具

Assisant 文档助手
Designer 直接操作控件进行GUI设计,Qt Creator内置,不需要特别打开。
Linguist 翻译外国语言用的,基本用不到

Qt新建项目

在这里插入图片描述
Widgets ------- 编写GUI
Console -------- 编写TUI
Qt for python Qt不止适合C++,同时也能用python和java。
Qt Quickb是 Qt 搞出来的一套新的开发GUI的方式,传统的方式叫 Qt Widget。
在这里插入图片描述
构建系统,通过Qt写的程序,涉及一系列“元编程”技术。(通过代码来生成代码)
Qt 框架在编译的时候,会自动先调用一系列的生成工具,基于你自己写的代码,生成一系列的其他C++代码。
1)qmake:老牌Qt 构建工具
2)Cmake:新一代Qt 构建工具,有一些开源项目会使用Cmake

在这里插入图片描述
使用Qt Creator 创建项目,就会自动生成一些代码出来,这些被生成的代码就包含一个类,此处就是要选择这个主动生成的类的父类是谁。
在这里插入图片描述
QMainWindows 完整的应用程序窗口(包含菜单栏,工具栏,状态栏,等)
Qwidget 表示一个控件(窗口上的一个具体的元素,输入框,按钮,下拉框,等等)
QDialog 表示一个对话框。
在这里插入图片描述
Widget:程序自动生成的代码的类名
QWidget:程序自动生成的类的父类
Qt 中内置的类都是以Q前缀开头的。
file:自动生成的类存放的位置
在这里插入图片描述
Qt 中创建图像化界面的方式有两种,
1)直接通过C++代码的方式创建界面
2)通过form file,就可以以图形化的方式来生成界面(适合小白,更方便快捷)

在这里插入图片描述
选择一下基于那个编译器的Qt SDK来编译后续代码

PS:QT创建的项目目录路径中不能带有中文,会导致运行失败。

在这里插入图片描述
main.cpp
main的形参就是命令行参数,
在这里插入图片描述
编写一个QT的图形化界面程序,一定要有一个QApplication对象!
在这里插入图片描述

Widget是刚才在创建项目的时候,生成的类的类名,这里相当于创建了一个控件,并且显示出来。
.show()就是让控件显示出来,.hide()方法就是让控件隐藏,这些方法都是Widget 的父类QWidget提供的。
在这里插入图片描述
.exec表示让程序跑起来
在这里插入图片描述
这里就是Widget类的声明,
在这里插入图片描述
header guard 保证头文件只被包含一次,更推荐写 #pragma once
在这里插入图片描述
程序生成的类
在这里插入图片描述
QWidget就是创建项目时,选择的父类,这里声明了程序生成的类继承了父类,当时创建项目时选择的父类是哪一个,继承的父类就是哪一个。这里的父类都是Qt SDK内置的,想要使用哪个类,就需要包含对应的头文件。
在这里插入图片描述
Qt 的设定是,使用QT 内置的类,包含的头文件的名字和类名是一致的
不是所有Qt 的类都需要显式包含头文件。
C++中,头文件是可以被“间接包含的”,比如引入了 a.h ,a.h 里面又包含了b.h ,此时就当与吧a.h 和b.h 都包含了。
后续代码的书写原则就是,一个Qt 的类,直接拿过来用,如果可以用,就不用在显式包含头文件了,如果这个类提示找不到定义,再来手动的把对应的头文件包含一下。
在这里插入图片描述
是一个Qt 内置的宏.
宏本质上是文本替换.
Q_OBJECT展开之后,就会生成一大堆的代码,
Qt 中有个核心的机制,信号 和 槽,如果某个类想使用 ‘信号和槽‘ 就需要引入 Q_OBJECT这个宏

PS:创建实例的时候,自动调用构造函数,销毁实例的时候,自动调用析构函数
在这里插入图片描述
QT中引入了对象树 机制。创建的Qt 的对象,就可以把这个对象给挂到对象树上。往树上挂的时候,就需要指定 父节点,
在这里插入图片描述
和form file密切相关。

在这里插入图片描述
在这里插入图片描述
创建项目生成的头文件
form file被 qmake生成的头文件
在这里插入图片描述
把form file生成的界面和当前Widget关联起来
在这里插入图片描述
双击widget.ui 可以直接调用Qt Designer,打开UI文件,图形化的界面编辑器
在这里插入图片描述
可以直接拖拽左侧的控件到程序窗口中,就可以创建出具体的界面了
在这里插入图片描述

编辑属性,每个控件都有很多属性,
在这里插入图片描述
此时,再点击左侧的编辑按钮,此时显示的内容,就是UI文件的本体了,这个格式就是xml格式,和html非常相似,都是使用成对的标签来表示数据~~(也存在单标签)
xml这里的标签,有哪些标签,都表示什么含义,这个是开发QT的程序员决定的。(这里的标签含义不需要关注)知道UI文件本质上是一个XML即可。
Qt 中是使用XML去描述程序的界面是什么样的,进一步的qmake会调用相关的工具,依据这个XML文件生成一些C++代码,构造成我们需要的界面。
在这里插入图片描述
.pro文件,Qt 项目的工程文件 也是qmake工具构建时候的重要依据~~
在这里插入图片描述
按照c++11来编译
在这里插入图片描述
描述了当前项目中,参与构建的文件都有哪些(编译器要编译哪些文件)这个地方不需要手动修改,Qt Creator帮我们维护好。
在这里插入图片描述
这些都是项目的源文件,点击构建后,会生成一些新的文件,
右键.pro文件,在Explorer中显示,可以打开资源管理器,看到代码对应的目录
在这里插入图片描述
在运行一次程序之后,就会在项目目录并列的地方,多出来一个 “ build-xxxx”目录,这个目录中存放的就是该项目运行过程中,生成的一些临时文件。
在这里插入图片描述
在这里插入图片描述
ui.widget 是xml生成的.h文件!!
在这里插入图片描述
在这里插入图片描述
Qt 自动生成的代码,这个代码会在setupUI这个方法中,生成出界面的具体细节的图形化界面。

Qt 图形化方式创建

在这里插入图片描述
在这里插入图片描述
显示控件(Display Widgets):标签控件(Label)
在这里插入图片描述
Qt Designer右上角通过树形结构,显示出了当前结构上有哪些控件。
在这里插入图片描述

刚才往界面上拖拽了一个QLabel控件,此时,UI文件的XML中就会多出来这一段代码~~
进一步的qmake就会在编译项目的时候,基于这个内容生成一段C++代码,通过这个C++代码,构建出图形化界面。(这个过程是QT自动完成的)
在这里插入图片描述
在这里插入图片描述
一般通过代码来构造界面的时候,通常会把构造界面的代码放到Widget/MainWindows的构造函数里面中。
在这里插入图片描述
找不到QLabel的声明
Qt 中,每个类都有一个对应同名的头文件。
在这里插入图片描述
包含上对应的头文件即可。
在这里插入图片描述

两种声明标签的方法
在这里插入图片描述
设置控件中,要显示的文本是啥。(字符串)
在这里插入图片描述
new了一个对象之后没有Delete,会不会造成内存泄漏呢?
PS:作为一个程序员,关注内存泄漏,是要融入到DNA中的事情,内存泄漏是一个非常严重的事情!!
上诉代码在Qt 中并不会产生内存泄漏,label对象会在合适的时候被析构释放~~
之所以能够把对象释放掉,是因为把这个对象挂到了对象树上。

对象树

QT 会通过树形结构,把界面上要显示的这些控件对象都组织起来,这样就能在合适的时机(窗口关闭/销毁),把这些对象统一释放。
如果某个对象提前销毁,此时就会导致对应的控件在界面上不存在了
在这里插入图片描述
新建一个自定义类的时候,QT creator帮我们生成了一些代码,但并没有生成全部代码,这个头文件只能靠我们自己手动包含。
在这里插入图片描述
QT creator中可以用F4来切换头文件和对应的.cpp文件。

7/5

对象树续集

在这里插入图片描述
myLabel 已经继承了QWidget 和 QLabel ,所以可以直接使用myLabel new 出新的对象。
如下
在这里插入图片描述
将 myLabel声明的对象挂到对象树上,后面的析构函数中附带的打印才会出现。
在这里插入图片描述
QLabel(parent) 调用父类构造函数,调用这个,才能让咱们自己类的对象加入到Qt 对象树中
创建自定义的类,最主要的目的,是定义一个析构函数,在析构函数中,完成打印,方便我们看到最终的总动销毁对象的效果。
在这里插入图片描述
写完一个函数的声明之后,按下alt+enter,就可以自动
的在对应的CPP文件中添加函数的定义了。
乱码问题出现的问题只有一个,那就是编码方式不匹配造成的。
在这里插入图片描述

乱码问题

问题一 一个汉字占几个字节

前提条件:当前中文编码使用的是那种方式(字符集)
计算机存的是二进制数字,在ASCII码表中,规定了每个字符都有一个对应的数字表示。
汉字的表示则是用一个更大的表格,给每个汉字分配一个字母即可。表示同一个汉字,不同的字符集用的数字不相同,流传到现在的字符集主要是两种方式:1.GBK(中国大陆)使用两个字节表示一个汉字。2.UTF-8/utf8 变长编码,表示一个符号,大概使用2-4个字节,但在utf8中,一个汉字,一般就是3个字节。
在这里插入图片描述
在这里插入图片描述
这个文件是UTF-8 BOM 编码。

QString

Qt 中有一个东西,QString,是可以帮助我们自动的处理编码方式的,不止是QString,Qt 也提供了专门用来打印日志的工具,也能自动处理编码。
Qt 中提供了一个Qdebug工具,借助这个就可以完成打印日志的过程,很好的处理字符编码。
在这里插入图片描述
Qdebug是Qt中的类,但不会直接使用。我们使用的qDebug是一个宏,可以帮助我们使用Qdebug。
在这里插入图片描述
后续在Qt 中,如果想通过打印日志的方式,输出一些调试信息,都优先使用qDebug,虽然使用cout也行,但是cout对于编码的处理不太好,在Windows上容易出现乱码。
使用qDebug,还有一个好处,打印的调试日志,是可以统一进行关闭的。可以通过一些编译开关来实现一键式关闭日志。

小结

1.认识QLabel类,能够在界面上显示字符串。
通过setText来设置的。参数QString(Qt 中把C++里的很多容器类,进行了重新封装。)
2.内存泄漏/文件资源泄漏
3.对象树.Qt 中通过对象树,来统一的释放界面的控件对象。Qt 还是推荐使用使用 new 的方式在堆上创建对象,通过对象树,统一释放对象,创建对象的时候,在构造函数始中,指定父对象(此时才会挂到对象树上)
如果你的对象没有挂到对象树上,就必须记得手动释放!!!
4.通过继承自Qt 内置的类,就可以到达对现有控件进行功能扩展效果。
Qt 内置的QLabel,没法看到销毁过程,为了看清楚,就创建类MyLabel,继承自QLabel重写 析构函数。在析构函数中,加上日志,就可以看到对象释放的过程了。
5. 乱码问题 和 字符集 ~ MySQL
6. 如何在Qt 中打印一个日志作为调试信息,使用Cout是可以的,但字符编码处理的不好,也并不方便统一进行关闭,Qt 中推荐使用qDebug() 完成日志的打印。

7/8

使用输入框实现HelloWorld

控件生成

在这里插入图片描述
1.单行输出(line edit)
2.多行输出(text edit)

在这里插入图片描述
在QLineEdit 的 text 编辑框中是可以直接更改文本的。

在这里插入图片描述
运行程序之后,会出来一个文本编辑框,可以直接在文本编辑框中进行编辑。

代码生成

在这里插入图片描述
在这里插入图片描述

信号和槽

本质上就是给按钮的点击操作,关联上一个处理函数,当用户点击的时候,就会执行这个处理函数。
在这里插入图片描述
在Linux网络编程中,这个函数是用来给TCP socket建立连接的。写TCP客户端的时候,就需要先建立连接,然后才能读写数据~~
Qt 中的connect是QObject 这个类提供的静态函数,它的作用就是连接信号 和 槽。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
访问到 form file(ui文件)中创建的控件!!!
在这里插入图片描述
在这里插入图片描述

在Qt Designer中创建一个控件的时候 这时就会给这个控件分配一个objectName属性。这个属性的值可以更改,要求是在这个界面中是唯一的。(不能和别的值重复),在objectName中,设置成什么值,生成的变量名就叫什么名字,就需要

qmake在预处理.ui文件的时候,就会根据这里的 objectName生成对应的C++代码,c++代码中该QpushButton对象的变量名字就是这里的 objectName.
这个变量就是UI属性中的成员变量。
这个objectName改了之后,就导致其他的ui->Widget 也要改成 UI->HelloWorld,

当 alt+Enter创建函数无效的时候,就说明该函数已经存在,所以无法创建。

在这里插入图片描述
对应的处理动作,点击后会有哪些事件发生,
在这里插入图片描述
点击后上面的文字会进行改变。
在这里插入图片描述

指针ui是qmake自动生成的。上述运行之后如下所示。
在这里插入图片描述

代码完成上述按钮

在这里插入图片描述
首先定义一个按钮,然后用信号和槽的关系,将这个按钮与 handleClick函数关联起来;
在这里插入图片描述
对于纯代码版本,案件对象是我们自己new出来的,为了保证其他函数也能够访问到这个变量,就需要把按钮对象 设定为Widget 的成员变量。
在这里插入图片描述
声明 handleClick 函数,然后开始在widget 中定义函数,
在这里插入图片描述
完成函数编写,运行即可。

按照函数名 来进行连接

在这里插入图片描述
函数名符合后,也能直接连接。

两者对比

纯代码版本中的一些控件对象是我们自己new出来的,所以为了保证在其他函数中能访问到这个对象,我们就需要把这些个控件对象设定为 Widget 的成员变量, 而使用控件直接做出界面,这时候已经不需要我们再new,new对象的操作已经被Qt 自动生成了,而且这个按钮对象,已经作为 UI对象里的一个而成员变量了,
对比来说,如果当前的程序界面是比较固定的,此时就会以图形化的方式来构造界面,但如果程序界面,经常要动态变化,此时就会以代码的方式来构造界面。总结来说,那种方便用那种,而且两种方式也不冲突,可以配合使用。

Qt 命名规则

  1. 起名要有描述行,
  2. 名字如果比较长,由多个单词构成,就可以使用蛇形命名法(student_cout),或者驼峰命名法(StudentCount)。

7/9

查询文档的方式

1.光标放到要查询的类名/方法名上,直接按 F1
2.Qt creator 左侧栏,帮助。
实际开发中,会用到很多第三方库和框架,很可能用到的库和框架都很小众,那就只能通过阅读文档来学习了,
(最核心的库)就是官方文档(大概率是英文)

初始Qt 坐标系(左手坐标系)

坐标体系:以左上角为原点(0,0),X向右增加,Y向下增加。
给Qt 的某个控件设置位置,就需要指定坐标,对于这个控件来说,坐标系原点就是相对于父窗口/父控件的。
在这里插入图片描述
这个范围是代码中创建的Widget 的范围,默认是(0,0),可以用move函数来调整按钮的位置
在这里插入图片描述
系统自动生成的,不在Widget范围之内。
在这里插入图片描述
move函数改变了按钮的位置。这个窗口的位置,也是可以移动的
在这里插入图片描述
效果:
在这里插入图片描述

信号与槽

1.信号和槽概述
在Qt 中,用户和控件的每次交互过程称为一个事件,每个事件都会发出一个信号,用户点击按钮会发出“按钮被点击”的信号,用户关闭窗口会发出”窗口被关闭“ 的信号。

Qt 中的所有控件都具有接收信号的能力,一个控件还可以接受多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作 , 在Qt 中,控件对信号做出的相应动作就称之为槽。

信号和槽是Qt 独有的消息传输机制,它能将相互独立的控件关联起来,比如,“按钮”和“窗口”就是两个独立的控件,点击按钮并不会对窗口iu造成任何影响。通过信号和槽机制,就可以江“按钮”和窗口关联起来。

Qt 信号三要素

  1. 信号源:由哪个控件发出的信号。
  2. 信号的类型:用户进行不同的操作,就会触发不同的信号。(区分用户不同的操作)
  3. 信号的处理方式:槽(slot) => 函数,qt中用connect 这样的函数,把 一个信号和一个槽 关联起来,后续只要信号触发了, Qt 就会自动的执行 槽函数。(所谓的槽函数本质上也是一种回调函数)

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

connect

connect 是QObject 提供的 静态的成员函数。Qt 中提供的这些类,本身是存在一定的继承关系的~~
QObject 就是其他Qt 内置类的一个“祖宗”。

connect(sender, SIGNAL(senderSignal()), receiver, SLOT(receiverSlot()));

  1. sender:信号源

  2. signal:信号类型
    在这里插入图片描述click: 是一个slot 函数,作用就是在调用的时候相当于点击了一下按钮。
    clicked:过去分词形式,完事了,点完了。
    在这里插入图片描述
    1)click的函数前面的图标表示是 槽函数
    2)clicked 的函数前面的图标 表示的是 信号函数

     	connect要求,前面这俩参数必须是匹配的,button的类型如果是 QPushButton*,此时,		
     	第二个参数的信号必须是QPushButton 内置的信号,不能是一个其他的类,
     	 比如QLineEdit的信号~~
    
  3. receiver:是接收信号并执行槽函数的对象,//通过该对象名称,可以找到信号对应的目标对象的成员函数,即槽函数。
    在这里插入图片描述
    close 是QWidget 内置的槽函数,Widget继承自QWidget,也就继承了父亲的槽函数。

  4. receiverSlot : 是接收信号执行的槽函数。//关心某个信号的目标对象的处理函数,即当发送方发送事件时,关心该事件的接收对象的槽函数(成员)函数被调用。
    在这里插入图片描述

两个问题

  1. 我们怎么知道QPushButton 有个clicked 信号?我们怎么知道QWidget有一个 close槽?Qt 都提供了哪些内置的信号和槽 让我们可以直接使用呢?

     多看文档!!!!!
    

大家在翻阅文档的时候,如果在当前类中没有找到对应的线索,不妨看看这个类的父类,或者这个类的父类的父类,
在这里插入图片描述

  1. 在这里插入图片描述
    在这里插入图片描述
    char* 和函数指针是同一个东西吗,当然不是!
    C++中,不允许使用两个不同的指针类型相互赋值,函数传参,本质上就是赋值,
    上述文档给出的 是旧版本的 Qt 的connect 函数的声明,那时给信号参数传参,要搭配一个SIGNAL宏,给槽参数传参,搭配一个SLOT宏,传入的指针转成 char*
    Qt 5 开始,对上述写法做出了简化,不再需要写SIGNAL和SLOT宏了,给connect提供了重载版本,第二个参数和第四个参数成了泛型参数,允许我们传入任意类型的函数指针了。

此时 connect函数就有了一定的参数检查功能,如果传入的第一个参数和第二个参数不匹配,或者第三和第四个函数不匹配就会导致编译出错。

自定义 槽函数

所谓的自定义一个槽函数和自定义一个普通的函数,没什么区别。
在这里插入图片描述
第二种自定义槽函数的方法

在这里插入图片描述
在这里插入图片描述
这个窗口就列出了QPushButton 给我们提供的所有的信号~~(还包含了父类的信号)
点击clicked()
在这里插入图片描述

直接就声明定义了该函数,直接在定义里编写需要的代码即可,在Qt 里,除了通过connect 来
连接信号槽之外,还可以通过函数名字的方式来自动连接!!

在这里插入图片描述
pushButton 是这个按钮的objectName,当函数符合上述规则之后,Qt 就能自动的把信号和槽给建立上联系!!

如果我们通过图形化界面创建控件,还是推荐使用这种快速的方式来连接信号槽,如果我们是通过代码的方式来创建控件,还是得手动connect。

Qt 中也允许自定义信号。
自定义槽函数,非常关键,开发中大部分情况都是需要自定义槽函数的。
自定义信号,比较少见,实际开发中很少会需要自定义信号,在GUI,用户能够进行哪些操作,是可以穷举的~~,Qt 内置的信号,基本上已经覆盖到了上诉所有可能的用户操作,因此,使用Qt 内置的信号,就足以应付大部分的问题了。

自定义信号

自定义信号需要先连接(connect),然后才能发送信号,
  1. 所谓的Qt 的信号,本质上也就是一个“函数”,Qt 5 以及更高版本中,槽函数和普通的成员函数之间,已经没啥差别了。但是,信号,则是一类非常特殊的函数**。程序员只要写出函数声明,并且告诉Qt ,这是一个“信号”即可,**这个函数的定义,是Qt 在编译过程中自动生成的。
  2. 作为信号函数,这个函数的返回值,必须是 void .有没有参数都可以,甚至也可以支持重载.
    **signals:**扫描到类中包含signals这个关键字的时候,此时,会自动把后面的函数认定为信号函数,

emit 信号函数,发出信号,

第一步,声明信号和槽函数
在这里插入图片描述
第二步 连接自定义的信号,

在这里插入图片描述

第三步 自定义的信号函数都需要主动触发
在这里插入图片描述

PS: 发送自定义信号的操作,可以在构造函数里,也可以在其他合适的代码里。
在这里插入图片描述
PS: !!!! Qt 中如果要让某个类能够使用信号槽(可以在类中定义信号和槽函数),则必须要在类开头的地方加上 Q_OBJECT 宏。
在这里插入图片描述

带参数的信号槽

当信号带有参数的时候,槽的参数必须和信号的参数一致~~
此时发射信号的时候,就可以给信号参数传递实参,与之对应的这个参数就会被传递到对应的槽函数中.(这里的参数必须要一致,要求的是类型,个数不一致也可以)不一致的时候,要求信号的参数的个数必须要比槽的参数要更多。
Qt 中有很多内置的信号,也是带有参数的,clicked 信号就带有一个参数,这个参数表示目前按钮是否处于“选中状态”,这个选中状态对于QPushButton 没啥意义。对于QCheckBox 复选框,就很有用了。

参数个数不一样的

情况
信号函数的参数超过了 槽函数的参数个数,是可以正常使用的,信号函数的参数个数少于槽函数的参数个数,此代码就无法编译通过。
个数不一致,槽函数就会按照参数顺序取参~~至少确保槽函数的每一个参数都是有值的。

7/11

信号和槽 存在的意义

信号槽, 在各种GUI的开发框架中,是一个比较有特色的存在,其他的GUI开发,搞得方式都要更简洁一些。网页开发中响应用户操作,主要靠的是回调函数,大部分的GUI开发也都是这么搞得,

Qt信号槽,connect这个而机制,设想是很美好的,
1)解耦合,
2)多对多效果,

关于信号槽两个补充的知识点

  1. 使用disconnect 来断开信号槽的连接。它和connect的用法是基本一致的,
    主动断开,往往是把信号重新绑定到另一个槽上,不断开就会导致,发送一个信号,相应两个槽。

  2. 定义槽函数的时候,也是可以直接使用lambda 表达式的!!
    connect(1,2,3,{});

信号与槽小结

  1. 信号槽是什么,和Linux中的信号进行对比,
    1.信号源
    2.信号的类型
    3 信号的处理方式

  2. 信号槽的使用,connect的使用,

  3. 如何查阅文档

  4. 自定义槽函数
    本质上就是自定义一个普通的成员函数,还可以让Qt Creator 自动生成隐式的connect,可以通过函数名字特定规则完成自动连接。

  5. 自定义信号。
    信号本质就是成员函数,函数的定义是Qt 自己完成的,我们只需要写函数声明。
    emit:完成信号的发射
    signals:自定义信号关键字

6.信号和槽还可以带有参数,
信号的参数和槽的参数要一致

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值