Qt笔记
0. Qt快捷键
界面控制
F1查看帮助 Esc回到代码
F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果)
Shift+F2 声明和定义之间切换
F4头文件和源文件之间切换
Ctrl+H diff
Alt+左右 切换最近文件(UI下Alt+←可以直接到代码)
Ctrl+Tab 快速切换最近文件
Ctrl+W 关闭当前文件
代码控制
Ctrl+ A I 自动整理
Ctrl+/注释行,取消注释行
Ctrl + F 查找
Ctrl+[] 调到块的首位
F3 查找下一个 Shift + F3 查找上一个
Ctrl + Shift + Up 将当前行的代码向上移动一行
Ctrl + Shift + Down 将当前行的代码向下移动一行
Ctrl+Alt+ 上下 复制一行
Ctrl+Enter 下一行
Ctrl+Shift+Enter 上一行
按着Alt shift鼠标
在头文件里按 Alt+Enter,再按回车键将在cpp中添加对应的方法实体
编译控制
Ctrl+B编译工程
Ctrl+R运行工程
F5开始调试
Shift+F5停止调试
F9设置和取消断点
F10 单步前进
F11 单步进入函数
Shift + F11单步跳出函数
1. 信号与槽
信号和槽关联的格式
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
信号和槽的使用
- 一个信号可以连接多个槽
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int)));
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int)));
spinNum数值发生变化,两个槽进行相应,按照建立连接的顺序依次执行
- 多个信号连接一个槽
connect(ui->rBtnBlue, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
connect(ui->rBtnRed, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
connect(ui->rBtnBlack, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
任何一个radiobutton被点击 都会执行setTestFontColor函数
- 一个信号连接另外一个信号
connect(spinNum, SIGNAL(valueChanged(int)), this, SIGNAL(refreshInfo()));
- 信号和槽参数个数和类型要一致
- 使用信号和槽 需要加入Q_OBJECT宏
- 发射信号后,关联的槽函数执行完毕才会执行发射后面的代码
自定义信号
- 信号必须有signals关键字声明
- 信号没有返回值,但是可以有参数
- 信号就是函数的声明,只需声明,无需定义
- 使用:emit mySignal();
- 信号可以重载 需要用函数指针 void (类名::*funSignal)(参数,参数)= &类名::信号;
lambda表达式
CONFIG+=C++11
|
|
Qt5的connect
所有参数都是指针
connect(&信号发出者, &发送者的类名::信号名字, this, &接收的类名::槽函数名字)
属性系统 Q_PROPERTY() QCLASSINFO()
还没用到
sender()函数
|
|
2. Qt 类库
元对象系统
- QObject::metaObject()
QObject *obj = new QPushButton;
obj->metaObject()->classname();// 返回QPushButton
- QObject::inherits(const chaar * className);
判断一个对象实例是否是className的类
QTimer *timer = new QTimer;
timer->inherits("QTimer");//true
timer->inherits("QAbsractButton");//false
- 动态映射 dynamic cast
QObject *obj = new QMyWidget;
QWidget *Widget = qobject_cast<QWidget *>(obj); // ok myWidget是Widget的子类
QMyWidget *myWidget = qobject_cast<QMyWidget *>(obj); // ok
容器类
顺序容器 关联容器
顺序容器类
-
QList 数组、前后添加快,可以下标访问at()
insert replace removeAt move swap append prepend removeFirst removeLast isEmpty size -
QLinkedList 链表、基于迭代器访问、不提供下标发昂文
-
QVector 动态数组 性能高
-
QStack 栈 LIFO
push pop -
QQueue 队列 FIFO
enqueue dequeue
关联容器类
- QMap
QMap<Key,T>
QMap<QString,int> map;
map["one"] = 1;
map["two"] = 2;
map.insert("four",4);
map.remove("two");
//查找
timeout = map.value("TIMEOUT",30);//30是缺省值
- QMultiMap
- QHash
- QMultiHash
- QSet
集合 查找快 内部是QHash
set.contains(“cat”)
容器的迭代
- java迭代器
- STL迭代器
- foreach(宏)
java迭代器
容器 | 只读迭代器 | 可读写迭代器 |
---|---|---|
QList |
QListIterator |
QMutableListIterator |
QLinkedList |
QLinkedListIterator |
QMutableLinkedListIterator |
QVector |
QVectorIterator |
QMutableVectorIterator |
QSet |
QSetIterator |
QMutableSetIterator |
QMap<Key, T>, QMultiMap<Key, T> | QMapIterator<Key, T> | QMutableMapIterator<Key, T> |
QHash<Key, T>, QMultiHash<Key, T> | QHashIterator<Key, T> | QMutableHashIterator<Key, T> |
QListIterator的API:
函数 | 用途 |
---|---|
toFront() | 将迭代器移到list的最前面(在第一个项之前) |
toBack() | 将迭代器移到list的最后面 (最后一项之后) |
hasNext() | 如果迭代器没有到list的最后则返回true |
next() | 返回下一项,并将迭代器向前移动一个位置 |
peekNext() | 返回下一项,不会移动迭代器 |
hasPrevious() | 如果迭代器没有到list的最前面则返回true |
previous() | 返回上一项,并将迭代器移到上一个位置 |
peekPrevious() | 返回上一项,不会移动迭代器 |
STL风格的迭代器
容器 | 只读迭代器 | 可读写的迭代器 |
---|---|---|
QList |
QList |
QList |
QLinkedList |
QLinkedList |
QLinkedList |
QVector |
QVector |
QVector |
QSet |
QSet |
QSet |
QMap<Key, T>, QMultiMap<Key, T> | QMap<Key, T>::const_iterator | QMap<Key, T>::iterator |
QHash<Key, T>, QMultiHash<Key, T> | QHash<Key, T>::const_iterator | QHash<Key, T>::iterator |
STL风格迭代器的API:
表达式 | 用途 |
---|---|
*i | 返回当前项 |
++i | 将迭代器指向下一项 |
i += n | 迭代器向前移动n项 |
–i | 将迭代器指向上一项 |
i -= n | 将迭代器你向后移动n项 |
i - j | 返回迭代器i和j之间项的数目 |
foreach关键字
|
|
QString 类
- 转换到整数
toInt toLong toShort toUInt toULong - 转换到浮点数 toDouble toFloat
- 进制转换
QString str = ui->editDec->text();
int val = str.toInt();//10进制
str = QString::number(val,16);//16进制
str = str.setNum(val,16);
str = str.toUpper();
str = str.setNum(val,2);
//str = QString::number(val,2);
组字符串 arg
QString str = QString("%1 %2").arg("Mike").arg(123);
QString常用功能
- append() prepend()前面添加
- toUpper toLower
- count size length 功能相同 汉字算一个
- trimmed 去掉最后空格 , simplified 多个空格用一个替换
- indexOf lastIndexOf 出现位置
- isNull(未初始化) isEmpty(只有\0是true, 常用)
- contains() 包含
- endsWith startsWith 判断是否某个结尾
- left 和 right 从左右取出字符
- section 分割
QString 和 QByteArray
|
|
时间和日期类
- QTime 时间 21:46:58
- QDate 日期 2019-11-1
- QDataTime 日期时间 2019-11-1 21:47:35 时间转化为字符串
|
|
字符串转化为时间 datetime = QDateTime::fromString(str,“yyyy-MM-dd hh:mm:ss”);
定时器类 QTimer
|
|
3. Qt界面组件
- 按钮类
- QPushButton
- QToolButton
- QRadioButton
- item
- QListWidget
- 容器
- QStackWidget
- QWidget
- QFrame(可以带边框)
- 编辑类
- QComboBox
- QLineEdit
- QTextEdit
- 显示类
- QLabel
- QLcdNumber
- QProcessBar
SpinBox 整数的显示和输入
属性:
- prefix
- suffix
- mininum
- maxinum
- singlestep
- value
- displayIntegerBase
- decimals
下拉列表 QComboBox
addItem()
ui->comboBox->clear();
QStringList strList;
strList<<"aa"<<"aa"<<"aa"<<"aa"<<"aa"<<"aa"<<"aa";
ui->comboBox->addItems(strList);
- int currentIndex()
- QString currentText()
- int count
signal:
- void currentIndexChanged(int index)
- void currentIndexChanged(consst QString &text)
多行简单文本编辑器 QPlainTextEdit
cut copy paste undo redo clear selectAll
- 读取全部内容 toPlainText()
QLabel
- 显示文字
|
|
- 显示图片
|
|
- 显示GIF
|
|
- 显示网址
|
|
布局
- 水平
- 垂直
- 网格
布局属性,大小策略 垂直固定
自定义控件(提升)
- 有相同的父类
- 选中ui 右键 提升
4. Model/View结构
没写
5. Qt样式表
qss
QWiget::setStyleSheet()
QApplication::setStyleSheet()
可以为一个独立的子部件、整个窗口、整个应用程序指定一个样式表
|
|
- 选择器
- 属性
属性
- color 前景色
- background-color 背景色
- background-image:url(://img.jpg)
- border-image:url(://img.jpg)
- background-position和background-repeat
6. Qt事件 Event
所有事件类都继承于QEvent
app.exec 等待事件的发生
事件过滤器eventFilter -> 分发器event() -> 事件处理函数 ☆
自定义控件的新建方法
- add new c++class
- 继承QWidget
- 修改3处
- 头文件2处QWidget改为QLabel
- .cpp 冒号后面 QWidget改为QLabel
- 重写protected函数
事件
- 鼠标事件 #include
- 键盘事件 #include
- 定时器事件 QObject
事件的接收和忽略
|
|
event()函数 消息分发
#include <QEvent>
QWidget -> event()
不要轻易改event函数,return错 会让事件失效
事件过滤器
QObject eventFilter()
|
|
事件过滤器必须和被安装过滤器的组件在同一个线程 ,否则 过滤器不起作用
7. Qt绘图
画家QPainter -> QPaintEngine -> 绘图设备QPaintDevice
画图
在窗口绘图
10_PaintEvent 重写PaintEvent (注意写参数,重写虚函数,不是重载)
手动刷新
update();
绘图设备
12_QPixmap
- QPixmap: 针对屏幕进行优化 和平台相关,不能对图片进行修改
- QImage: 和平台无关,可以对图片进行修改,可以在线程里绘图
- QPicture:保存绘图的状态(二进制文件)
前两个保存出来的是图片,第三个保存出来是二进制
绘图设备相互转换
|
|
不规则窗口
- 给窗口画一张背景图‘
- 去窗口边框
- 设置背景透明
- 重写移动(移动坐标是相对于屏幕,是以左上角移动)
|
|
8. Qt文件操作
- 传统模式 参数char* int 返回值长度
- Qt模式 返回值是QByteArray
|
|
获取文件的信息
QFileInfo F1
|
|
QDataStream
数据流(二进制)
QTextStream
setCodec() // 按编码保存
QBuffer
#include <QBuffer> // 内存文件
memFile.buffer();//取出来
9. Qt TCP
服务器有 两个套接字 ,一个监听 一个传输
如果项目用到网络,需要添加
QT+=network
Linux Server 端
bind listen accept
read/write
Linux client 端
connect
read/write
QT Server 端 -QTcpServer
listen()【与bind合并】
//如果连接成功服务器会触发newConnection()信号
槽函数->取出建立好连接的套接字 类型:QTcpSocket
如果收到消息,通信套接字会受到readyRead()需要在对应槽函数做接收处理
read/tcp.write()
QT client 端 - QTcpSocket
connectToHost()
如果连接成功会触发connected()信号,不管服务器还是客户端
如果对方主动断开连接,会触发disconnected()信号
read/write
server
|
|
client
|
|
定时器对象QTimer
|
|
Qt UDP
没写
Qt TCP传文件
没写
10. Qt 线程
QThread
界面上有时间比较复杂的处理
简单线程
- 新建一个类 继承QThread
- 实现虚函数 run
- 创建一个线程对象
- 线程->start();
- 结束线程 回收资源 ->quit() ->wait();
线程PRO
- 新建一个类,继承于QObject
- 设置一个线程函数 名字随便
- 创建一个线程对象(不能指定父对象)
- 创建QThread子线程对象,可以指定父对象
- 把自定义线程类加入到子线程
- 启动子线程 thread.start() 线程函数并没有启动
- 必须通过signal slot启动
connect(this,&自定义信号,线程对象,线程函数); - 启动线程函数 emit 自定义信号();
注意
线程处理函数内不能操作图形界面 (纯数据处理)
connect的第五个参数
在多线程的时候才有意义,连接方式:默认 队列 直接
- 默认
- 如果是多线程 使用队列
- 如果是单线程 使用直接
- 队列:槽函数所在线程和信号接受者一样
- 直接:槽函数所在线程和信号发送者一样
11. Qt数据库
QT += sql
code
|
|
- 原文作者:xuehu
- 原文链接:https://www.xuehu96.com/post/cpp/qt/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。