Qt开发经验 --- 避坑指南(9)
文章目录
- @[toc]
- 1 信号槽
- 1.1 清空信号槽队列
- 2 查找未使用函数
- 3 日志功能
- 4 qt cmake执行install
- 5 数据库获取查询行数
- 6 Qt调用ffmpeg命令行录屏
文章目录
- @[toc]
- 1 信号槽
- 1.1 清空信号槽队列
- 2 查找未使用函数
- 3 日志功能
- 4 qt cmake执行install
- 5 数据库获取查询行数
- 6 Qt调用ffmpeg命令行录屏
更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1 信号槽
1.1 清空信号槽队列
- 当信号和槽函数分别在两个线程内时,默认使用的时基于事件循环的消息队列来进行通信,或者connect第五个参数使用Qt::QueuedConnection,这时信号触发槽函数是异步的(实际上使用过生产者消费者模式);
- 而信号槽的消息队列对开发人员来说是不可见的,所以不知道队列大小,容量;
- 这就会造成一个很严重的问题,当每1秒发出10个信号,而槽函数每一秒只能执行完成1次,就会有9个已经发出的信号得不到处理,会等待在队列中,时间长了后会导致数据越来越多,出现内存泄漏、溢出等问题。
- 而网上查找清空信号槽队列一般都是使用disconnect断开信号槽链接,但实际上这功能是无效的,断开链接后只是不会再增加新的信号,而已经存在与消息队列中的信号还存在。
- 所以这里就可以使用
QCoreApplication::removePostedEvents(this, QEvent::MetaCall);
来清空信号槽消息队列。
2 查找未使用函数
- Qt Creator14
- 鼠标在工程上右键选择【Find Unused C/C++ Functions】;
3 日志功能
使用qDebug封装日志功能
优点:
- 使用简单;
- Qt底层库的日志信息也可以记录到文件;
缺点:
需要自己对qDebug功能进行封装。
稳定性需要看自己封装得好不好。
在使用mingw编译器时性能会恶化很多(二十倍)。
使用spdlog日志库
优点:
- 无需封装;
- 功能稳定,性能强大;
缺点:
- 使用相对qdebug复杂一些;
- 需要自己编译配置。
编译器 | 编译模式 | spdlog | qDebug |
---|---|---|---|
mingw730 | debug | 6734 | 45871 |
mingw730 | release | 6609 | 40740 |
msvc2022 | debug | 10297 | 3098 |
msvc2022 | debug | 10540 | 3099 |
msvc2022 | release | 10801 | 2499 |
msvc2017 | debug | 7609 | 3032 |
msvc2017 | release | 7071 | 2153 |
mingw1310 | debug | 8125 | 57725 |
mingw1310 | release | 8572 | 38908 |
4 qt cmake执行install
- 在Qt中使用cmake编译后需要执行install安装编译后的库;
- 选择【项目】【构建步骤】,勾选install;
5 数据库获取查询行数
- qt使用sqlite数据库时,调用
int QSqlQuery::size()
无法返回行数,只能返回-1,可以通过下面代码计算行数;
query.last(); // 定位到最后一项
int size = query.at() + 1; // 获取大小
query.first(); // 返回第一项
query.previous(); // 定位前一项(开始位置)
6 Qt调用ffmpeg命令行录屏
- 使用ffmpeg录屏时如果使用mp4格式,当程序异常退出后mp4视频会出现moov损坏,视频无法播放,使用mkv格式可以避免。
QProcess process;
void start()
{QStringList arg;arg << "-f"<< "gdigrab"<< "-i"<< "desktop"<< "1.mkv"; // 录制视频使用mkv格式可以防止视频损坏process.start("ffmpeg.exe", arg);
}void stop()
{process.write("q"); // 停止录屏
}