QT的核心机制:信号与槽
Day1
- QT介绍
QT: C++应用
-
- 什么是QT
跨平台C++图形用户界面应用程序开发框架。
《1》跨平台: 支持各种的操作系统, windows、Linux、MAC
《2》编程语言:C++ 面向对象编程 类
《3》应用程序开发框架:图形用户界面 GUI应用程序 非GUI的应用程序
《4》丰富的API : 有250多个以上的类,并且类有做模块的划分,代码模块化程序高!
Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
Q_OBJECT 宏
QT 应用:
车载系统
KTV 点歌系统
WPS
咪咕音乐
飞车游戏
播放器
安防监控系统 –海康威视 执行记录仪、行车记录仪、智能手环
医疗行业、 上位机、军工企业
1-2、学习QT的什么
学习QT丰富的API、也要学会自定义类,在QT原有类的基础上派生新的类出来!!!1
-
- 怎么去学
以案例驱动的方式去学习
-
- 学习的思路
根据案例中的功能,先去分析需要用到什么,去找对应的类
大概的过一遍类里面的成员,选择合适的函数,去使用!
- QT的第一个工程的创建以及文件的说明
一个是带有UI文件的: 可以拖拽的方式快速设计界面
一个是不带有UI文件的:只能通过编写代码的方式去设计界面
Pro文件:
3、打印追踪
QT中所有的类都是Q开头的, 并且单词的一个字母都是大写的!!!
4、QT的核心机制:信号与槽
作用: 实现对象与对象之间的通信
4-1、案例:hello world
需求:
点击一个按钮,在文本框中去显示hello world
点击另一个按钮,把文本框内容清空
需要准备:
- 需要一个按钮对象 QPushButton
- 需要一个文本框对象 QTextEdit
- 创建对应的对象
- 点击按钮, 按钮会产生信号clicked(), 界面类对象就去接收一下这个信号,就可以在槽函数中做业务处理了!
信号: 是我们QT中类里面额外多的内容
关键字: signals
分类: 自定义信号、qt内部类提供的信号
槽: 也是QT中类里面额外多的内容
关键字: slots
分类: 自定义槽函数、qt内部类提供的槽函数
信号与槽如何进行关联呢?
Connect(信号的发送者, 信号, 信号的接收者, 槽函数);
非UI实现步骤:
- 引入需要用到的类头文件
- 在类的定义中增加对象的声明
- 在构造函数中进行实例化
- 运行,观察界面设计是否合理,做出调整
- 增加槽函数,实现业务
- 信号与槽函数的关联:connect函数
- 运行
UI设计界面的步骤:
- 拖拽需要的控件
- 修改每一个控件对象的名称
- 保存UI
- 运行,并检查界面是否符合要求
- 按钮右键-》转到槽-》选择信号-》槽函数中添加业务
- 运行
类总结:
QPushButton move()、resize()、setGeometry()、clicked()、setText()
QTextEdit setGeometry()、setText()、 clear()
4-2、案例:简易版的计算器
分析:
按钮QPushButton:计算、清空
文本框QLineEdit: 操作1、2、结果
运算符---下拉框显示: +、-、* 、/、 %
标签 QLabel:显示 =
代码实现如下:
类总结:
QLineEdit text()、setText()、
QString toDouble()、setNum()、 static修饰的number()、
QComboBox addItem()、 addItems() 、currentText()、
QStringList append()、 << 、 push_back()、 push_front()
QLabel
QPushButton clicked()
QMessageBox static修饰的 warning
5、QT里面如何去配置SQLite3数据库的环境
测试:
1、定时器QTimer
1-1、案例: 实时显示系统时间
分析: 每一秒都去更新一下系统时间
如何知道已经够1秒了: 需要用到定时器 以1秒为单位 产生信号,我们接收这个信号,更新时间!
如何获取系统时间呢? [static] QDateTime QDateTime::currentDateTime()
需要准备什么:
QTimer 开启 start(1000)、 timeout()信号 stop()关闭定时器
QLabel setText(QString)
QDateTime currentDateTime() toString() 日期格式的转成字符串
-
- 案例: 倒计时
分析:
按钮 –启动定时器 start 产生timeout信号 关闭 stop
更新时间
类:
QTimer start() timeout()信号 stop()
QLCDNumber display()
QTime addSec() toString()
QPushButton clicked() setText() 、text()
2、图片的显示
2-1、案例:静图显示---开灯、关灯,切换图片
思考:
如何加载图片数据 QPixmap load
需要:
QPushButon 按钮 clicked()、 setText()、text()
QLabel 显示图片 setPixmap(const QPixmap &) setScaledContents(true)
QPixmap load() scaled()
按钮显示背景和窗口设置背景图片
图片资源的加载步骤:
- 选中工程-》右键-》add new -》 Qt-》qrc
- Add Prefix—》/
- Add files---》选择图片,打开
- 保存
- 复制路径: 找到对应的图片资源,右键—》copy path
2-2、案例:动图显示---打开风扇、 关闭风扇
分析:
QPushButton按钮:控制动图的显示与暂停 setEnabled()
QLabel标签:去显示动图 setMovie(QMovie *movie)
QMovie setFileName() start() stop()
3、进度条的显示 QProgressBar
3-1、案例: 模拟文件下载,下载进度展示
需要:
QPushButon 点击按钮,开始下载
QProgressBar 显示下载的进度 setRange()、setValue()、value()、
QTimer timeout信号产生,槽函数中随机生成一个数,表示这一秒的下载的进度
4、多界面的切换
强化:信号与槽的机制 自定义信号、如何实现数据传递
《1》.哪里需要哪里创建界面类的对象
存在的问题:一个界面会被创建很多个对象
《2》.使用QT的核心机制:信号与槽函数
应用:当界面比较少的情况下使用
《3》.使用单例模式来实现界面管理
信号与槽:
<1>.信号以及槽函数能否重载: 可以的
<2>.信号以及槽函数能否被继承: 可以的
<3>.信号能否传参: 可以的
信号要进行传参需要注意:
信号的参数个数要大于等于槽函数参数的个数,并且参数类型的匹配的顺序只能是从左向右!
<4>信号如何触发: emit 信号();
<5>信号不需要我们自己去实现
信号: int double
槽函数: int double
- 实现记事本案例
QWidget :所有界面类的父类
QMainWindow 是QWidget的子类
如上两个类的区别是什么?
1-1、添加菜单栏、工具栏、状态栏到窗口
QMenuBar
QToolBar
QStatusBar
1-2、给菜单栏中添加菜单
QMenu
-
- 给菜单添加选项(动作)
QAction
1-4、给窗口中添加输入文本框 QTextEdit
注意:当文本框内容发生变化的时候,窗口标题要发生变化,此时去监测文本框的信号即可!
1-5、给窗口根据动作设置状态栏相关信息
1-6、处理动作相关的业务
<1>新建
分析:
当文本内容没有变化的时候,选择新建
文本框中内容清空, 窗口标题变成了 无标题-记事本,原来的文件关闭。
当文本内容发生变化的时候,选择新建
弹出消息对话框,选择保存、不保存、取消
如果选择保存:
如果文件名为无标题-记事本,要进行另存为的动作
原来的文件要进行保存(打开文件,获取文本框中的内容,写入文件中),关闭;
文本框中内容清空, 窗口标题变成了 无标题-记事本
如果选择不保存:
原来的文件关闭
文本框内容清空,窗口标题变成无标题-记事本
如果选择取消:
什么都不做!!!
代码实现:
<2>打开
分析:
当文本内容没有变化的时候,选择打开
弹出一个文件选择对话框,选择你要打开的文件,然后打开文件,读取文件中的内容,把内容设置文本框中,窗口标题变成文件名!
当文本内容有发生变化,选择打开:
弹出消息对话框,可以选择保存、不保存、取消
如果选择保存:
如果文件名是无标题-记事本,先进行另存为,然后在弹出文件选择对话框
保存原来文件的内容
弹出一个文件选择对话框,选择你要打开的文件,然后打开文件,读取文件中的内容,把内容设置文本框中,窗口标题变成文件名!
如果选择不保存:
弹出一个文件选择对话框,选择你要打开的文件,然后打开文件,读取文件中的内容,把内容设置文本框中,窗口标题变成文件名!
如果选择取消:
什么都不做
代码实现:
共性提取出来,单独封装一个函数:
<3>保存
分析:
判断文件名,如果文件名是 无标题-记事本,进行另存为!
获取到文本框当前的内容,写入文件中,窗口标题变成文件名!
代码实现:
<4>另存
分析:
弹出一个文件选择对话框, 获取到另存为的文件的名字,然后获取文本框中的内容,写入文件中,窗口标题变成了另存为之后的文件的名字!
代码实现:
-
- 给工具栏添加工具按钮或者菜单动作的快速访问入口
<5>字体设置 QFontDialog QFont
<6>字体颜色设置 QColorDialog QColor
总结:
QMainWindow setMenuBar()、addToolBar()、setStatusBar()、setCentralWidget() 、
setWindowTitle()
QMenuBar addMenu
QToolBar addAction()、 addWidget()
QStatusBar
QMenu setTitle() addAction()
QAction setShortCut()、setIcon()、setStatusTip()、信号 triggered()
QTextEdit document()、toPlainText()、 setText()、 信号 textChanged()、clear()、 setFont()、 setCurrentFont()、 setTextColor()
QTextDocument isModified()
QMessageBox static修饰的question()
QFile open()、 readAll() 、write()、close()
QFileDialog getSaveFileName()、getOpenFileName()、
QFileInfo filename()、
QString toUtf8()、
QToolButton setIcon()、 信号 clicked()
QFontDialog getFont()
QFont
QColorDialog getColor()
QColor