QT实战经验之谈
以项目开发为基础,在实战中深入理解QT各大知识点,并记录关键、实用、项目常用等技术点,逐步打造完善的QT知识池,以供广大QT开发者学习借鉴。
泄漏的内存
十年软件开发经验
展开
-
深入理解QTimer::singleShot的参数,及使用时需要注意的点
singleShot有很多重载函数,各有自己的使用场景,使用不当,容易导致奔溃或者达不到预期。1、时间精度:查看源码可知,调用的时候若没有传入Qt::TimerType参数,则设置的超时时间小于等于2000ms时,使用精度更高的时钟类型:Qt::PreciseTimer,否则使用精度次高的Qt::CoarseTimer。2、不恰当使用lambda表达式导致奔溃如下为singleShot使用lambda的两种常用方式,区别在于第二个参数,为了访问类成员,lambda都捕获this指原创 2021-11-24 16:29:44 · 14843 阅读 · 1 评论 -
QEventLoop的高阶使用——在UI线程使用时过滤用户输入事件
在网络编程中,往往有这种需求,给服务器发送命令1,然后等待服务器应答命令1,然后根据应答的结果判断是否需要发送命令2,命令3.....要求不卡顿界面。伪代码://发送命令1syncSendData(command_1); //向服务器发送command_1//命令1收到服务器的应答,发送命令2syncSendData(command_2);//命令2收到服务器的应答,发送命令3syncSendData(command_3); . ...原创 2021-09-08 21:07:49 · 3542 阅读 · 0 评论 -
QT在多线程中正确使用数据库MySQL
问题:很多QT新手多线程使用数据库时,经常遇到警告:QSqlDatabasePrivate::database: requested database does not belong to the calling thread.究其原因,帮助助手明确说明Threads and the SQL ModuleA connection can only be used from within the thread that created it. Moving connections bet原创 2021-09-29 17:50:48 · 4373 阅读 · 1 评论 -
QT在子线程中正确使用定时器QTimer,及IO类的对象跨线程调用问题
需求:在子线程中定时执行任务,要求不受主线程(UI线程)卡顿的影响需求解读:因为主线程操作UI或者读取数据库较慢时容易导致卡顿,如果QTimer的timeout信号是放在主线程发送,则遇到主线程卡顿时,timeout信号未能及时发出,导致timeout信号绑定的槽函数不能在预定的时间间隔下执行,所以只能在子线程中发送timeout信号,这就要求QTimer的对象需要在子线程中。...原创 2021-09-08 18:33:45 · 9846 阅读 · 5 评论 -
c++11 简化、规范书写单例模式
单例模式在项目是最常用的设计模式之一,一个稍大点的项目,往往有很多类使用了单例模式,所以掌握单例模式至关重要。但是看过太多项目中使用的单例模式并不规范,只是简单的将默认构造函数私有化然后提供一个静态成员函数获取对象。其存在两大问题:1、不私有化拷贝构造函数和赋值运算符,更有甚者,自己还在代码中使用了拷贝构造函数或者赋值运算符,单例变多例,如 A a = A::instance();。不理解 单例 为何意。2、不考虑创建对象时线程安全问题。如: 为了解决上述两个问题,在写单例模式时,需要将原创 2022-07-05 16:17:27 · 443 阅读 · 0 评论 -
QWT自定义坐标轴标签及同一条曲线显示多种形状样本点
一:先上效果图,横轴纵轴可以根据需求显示任意文本,每个样本点也可以显示成任意形状二:横纵轴显示任意文本实现:QwtPlot类提供如下函数,用于设置坐标轴文本显示。void setAxisScaleDraw( int axisId, QwtScaleDraw * );所以通过继承QwtScaleDraw类,重写下面的虚函数,按照自定义的规则返回文本。virtual QwtText label(double v) const;具体实现,将坐标轴的文本放到list里,挨...原创 2021-09-29 11:44:30 · 2265 阅读 · 8 评论 -
C++使用模板函数实现工厂模式功能
工厂模式属于创建型模式,根据不同的参数创建不同的对象,大致如下://基类class Phone{};//子类class XiaomiPhone : public Phone{};//子类class VivoPhone : public Phone{};//工厂class PhoneFactor{public: Phone* makePhone(int phoneType) { if(phoneType == XIAO_MI)原创 2021-12-01 16:45:44 · 333 阅读 · 0 评论 -
QT模态对话框的两种方式和区别
QT模态对话框的两种方式和区别原创 2023-02-01 11:24:38 · 580 阅读 · 0 评论 -
MySQL调优思路
影响范围由小到大:1、优化SQL语句,使用高效的SQL语句2、优化表结构的设计,如添加恰当的索引、使用恰当的数据类型、尽可能的把字段设置成NOT NULL等3、优化数据库参数配置,如查询缓存等...原创 2022-04-07 18:15:43 · 681 阅读 · 0 评论 -
QMap遍历删除元素
容器的遍历删除,很多新手都很容易出现bug。记录,以便自己查找: QMap<int, int> mapTest{{1, 1}, {2, 2}, {3, 3}, {4, 4}}; //Java风格 QMutableMapIterator<int, int> it(mapTest); //QMapIterator为只读的,所以用QMutableMapIterator while (it.hasNext()) { auto原创 2021-12-01 17:30:20 · 1999 阅读 · 0 评论 -
QSet的坑
std::set内部会自动对元素进行大小排序,而QSet不会,因为QSet内部使用的是哈希表,而std::set用的是红黑树。请看:原创 2021-11-22 15:05:28 · 1765 阅读 · 0 评论 -
Inno Setup 安装启动MySQL8.0服务关键脚本
//初始化MySQL WizardForm.StatusLabel.Caption := 'initializing server...'; ShellExec('open', ExpandConstant('{app}\...\MySQL\bin\mysqld.exe'), '--initialize-insecure --console', ExpandConstant('{app}\...\MySQL\bin\'), SW_HIDE, ewWaitU...原创 2021-11-12 11:05:58 · 922 阅读 · 0 评论 -
QTableWidget、QTableView单元格设置不可编辑的几种方法及使用场景
1、设置所有单元格都不可编辑1)在代码里设置:setEditTriggers(QAbstractItemView::NoEditTriggers);2)在控件的属性中设置。2、设置某行或者某列不可编辑,其他行列可编辑1)继承类QStyledItemDelegate,重写函数createEditor,让其返回空,(单元格较多时推荐使用)QWidget* ReadOnlyItemDelegate::createEditor(QWidget* parent, const QStyleOpti原创 2021-11-12 10:34:36 · 18250 阅读 · 4 评论 -
QTableWidget、QTableView表格设置输入限制0到255、0到128
项目需求:表格里某些行/列要求限制用户只能输入0到255之间的数字,某些行/列限制只能输入0到128实现:通过自定义代理类的方式。继承QStyledItemDelegate(不会导致QSS失效)或者QItemDelegate(会导致QSS失效),官方推荐继承QStyledItemDelegate头文件:#ifndef CUSTOMITEMDELEGRATE_H#define CUSTOMITEMDELEGRATE_H#include <QWidget>#includ原创 2021-11-03 17:38:19 · 8190 阅读 · 6 评论 -
QT两种方式读写XML文件的区别
两种方式:1)QDomElement ,该类的API使用类似开源的pugixml2)QXmlStreamReader &QXmlStreamWriter读:QDomElement是将整个 XML 文件读入内存,构建成一个树结构;而QXmlStreamReader是基于流的方式访问XML 文件。基于上述,若计算机的内存较小而xml文件较大时,推荐使用QXmlStreamReader方式。写:QDomElement写xml文件时,元素属性的顺序时......原创 2021-10-11 12:06:32 · 1108 阅读 · 0 评论 -
QTableView 不使用自定义委托的方式实现单元格添加下拉框 QComboBox
效果图:实现:1)继承代理类,实现自定义代理,网上很多教程,这里不在赘叙;2)使用接口:void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)代码如下,注意 ui->tableView->setModel(model); 必须在model添加数据之前才有效Widget::Widget(QWidget *parent) : QWidget(par..原创 2021-09-30 14:03:31 · 2020 阅读 · 3 评论