- Qt的介绍
1.1什么是Qt?
跨平台的c++的图形界面化的应用程序开发框架
跨平台:任何平台
c++:编程语言主要使用的是c++
图形界面:既可以开发GUI应用程序,还可以开发非GUI应用程序
应用程序开发框架:QT其实是一个组件库,里面有各种各样现成的类,我们想要实现某个功能,只需要实例化对应类的对象,然后调用其成员函数即可
- 创建Qt工程
qmake工具:
- 先根据源文件生成.pro文件
- 根据.pro文件生成Makefile
- 举例介绍QT中的控件和信号与槽机制
- 显示”hello world”
当点击btn(是随机的)的时候,显示”hello world”
分析一下:觉得这个东西跟进程中的信号好像有点像
回忆进程的信号是如何处理的?
- 信号源
- 信号处理函数
- 将信号和信号处理函数进行绑定
所以:
- btn被点击时产生clicked的信号
- widget中定义了这个信号的处理函数
- 将btn产生的clicked信号和widget的showHello函数进行绑定
实现计算器
- 将QString类型转换成基本数据类型
str.toInt();.....
- 将基本数据类型转换成QString
QString::number(a);
- 用到的类
QLineEdit QComboBox QPushButton QLabel QString
3、实现一个秒表
三个类:QTime QTimer QLcdNumber
QTime:可以将整型数转换成时间格式 获得当前系统的时间
QTimer:设置定时时间,当时间到达时,就会产生timeout的信号,而且是每隔你设置的时间就会产生timeout的信号,直到你stop
QLcdNumber:可以用来显示时间或者温度等等
- QLabel显示图片和动画
添加图片到工程中:右击工程-》添加新文件-》Qt-》Qt ResourseFile-》添加前缀--》添加文件--》拷贝文件的路径
QPixmap
QMovie
- 打开文件的对话框、QStringList
- 进度条的使用
QProgressBar
- 设置初始值
- 设置范围
- 设置当前值
- 如何实现界面切换
- 主界面和子界面的切换
>主界面切换到子界面,在主界面中实例化子界面的对象,当主界面的btn被按下的时候,在对应的槽函数中实现主界面隐藏,子界面显示
>子界面切换回主界面,实现切换的函数在主界面中,但是btn是子界面的,所以遇到的问题是如何在子界面btn被按下的时候,让主界面调用它的函数?
通过发送信号的方式来实现:首先子界面的btn被按下的时候,btn会发信号,告诉子界面自己被按下了,然后子界面知道了这件事情之后,又继续给主界面发信号,主界面收到信号之后,调用对应的函数即可
面临新的问题?子界面发什么信号?
需要子界面自定义信号
信号到底是个啥?
有参数、无返回值、没有实现只有声明的函数
什么是事件?
比如:
键盘输入---》系统--》将键盘输入的事件交给Qt的应用程序--》Qt的应用程序接收到系统给它的事件之后会将对应的事件构造成一个键盘按下的事件对象(QKeyEvent的对象)
同样的如果是鼠标移动Qt会创建一个QMouseEvent的对象
如果是鼠标按下Qt就会创建一个QMouseEvent的对象
QEvent:是所有事件类的基类
QWidget:是所有控件类的基类,在这个类中定义了好多事件处理函数,当对某个控件进行鼠标点击的操作时,就会调用对应的鼠标点击的事件处理函数,所有控件都会这样
but,Qt它如何知道哪个事件要调用哪个函数呢?
QObject中有一个event的函数,在这个函数进行了绑定,也就是说所有的控件类也有这个函数,因为QObject是所有类的基类
总结事件的处理流程:
鼠标或键盘会操作某个控件---》Qt会实例化对应的事件对象---》交给这个控件event函数--》event根据事件的类型调用对应的事件处理函数
注意:每一个控件都有自己的事件处理函数和event函数,如果某个控件对某个事件有响应,说明这个控件对这个事件处理函数进行了重写,也就是我们如果想要让某个控件对某个事件有所响应就需要重写这个控件的事件处理函数
思考:信号和事件有什么关系?
- 先有事件再有信号
- 信号是在事件处理函数中被emit的
- 网络编程
- QtTCP服务器和客户端
回顾linux下TCP的服务器流程:
- QtTCP服务器和客户端
- 创建一个流式套接字
- 绑定IP地址和端口号
- 建立监听以及等待连接
- 获得连接套接字
- 通信
- 关闭套接字
客户端的流程:
- 创建套接字
2、绑定IP地址和端口号(可选的) - 请求连接
- 通信
- 关闭套接字
Qt的服务器:
- 实例化监听套接字对象 QTcpServer
- 绑定地址信息
- 获得连接套接字对象 QTcpSocket
- 通信
- 关闭
Qt客户端:
- 实例化通信套接字 QTcpSocket
- 连接服务器
- 通信
- 关闭
1.2、Qt的客户端和linux服务器的通信
发送文件协议:
- 先发送文件头(文件名+文件大小:”1.jpg#1122”)char fileHead[50];
- 再发送文件内容
接收方:
- 先接收文件头 char fileHead[50];
- 解析文件头
- 按照文件大小接收文件内容
2、线程
为什么需要线程?
Qt的主线程一般用来和用户进行交互,子线程用来进行后台的数据处理
线程的创建?
回忆之前的线程:
- 创建线程
- 线程处理函数
- 触发线程处理函数
Qt中如何创建线程?
- 创建一个线程类继承于QThread
- 重写线程处理函数(run)
- 创建线程对象
- 触发线程处理函数(start)