Qt开发经验小技巧合集 (3)

Qtchart模块从Qt5.7开始自带,最低编译要求Qt5.4。在安装的时候记得勾选,默认不勾选。使用该模块需要引入命名空间。

#include <QChartView> QT_CHARTS_USE_NAMESPACE class CustomChart : public QChartView

QPushButton左对齐文字,需要设置样式表QPushButton{text-align:left;}

QLabel有三种设置文本的方法,掌握好Qt的属性系统,举一反三,可以做出很多效果。

ui->label->setStyleSheet("qproperty-text:hello;"); ui->label->setProperty("text", "hello"); ui->label->setText("hello");

巧妙的用QEventLoop开启事件循环,可以使得很多同步获取返回结果而不阻塞界面。QEventLoop内部新建了线程执行。

QEventLoop loop; connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec();

多种预定义变量 #if (defined webkit) || (defined webengine),去掉生成空的debug和release目录 CONFIG -= debug_and_release。

新版的Qtcreator增强了语法检查,会弹出很多警告提示等,可以在插件列表中关闭clang打头的几个即可,Help》About Plugins。也可以设置代码检查级别,Tools》Options 》C++ 》Code Model。

QSqlTableModel的rowCount方法,默认最大返回256,如果超过256,可以将表格拉到底部,会自动加载剩余的,每次最大加载256条数据,如果需要打印或者导出数据,记得最好采用sql语句去查询,而不是使用QSqlTableModel的rowCount方法。不然永远最大只会导出256条数据。
如果数据量很小,也可以采用如下方法:

//主动加载所有数据,不然获取到的行数<=256 while(model->canFetchMore()) { model->fetchMore(); }

如果需要指定无边框窗体,但是又需要保留操作系统的边框特性,可以自由拉伸边框,可以使用 setWindowFlags(Qt::CustomizeWindowHint);

在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码。

QString content = "测试中文"; QString note = content.toUtf8().toPercentEncoding();

Qt默认不支持大资源文件,比如添加了字体文件,需要pro文件开启。
CONFIG += resources_big

Qt中继承QWidget之后,样式表不起作用,解决办法有三个。强烈推荐方法一。

方法一:设置属性 this->setAttribute(Qt::WA_StyledBackground, true);

方法二:改成继承QFrame,因为QFrame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制。

方法三:重新实现QWidget的paintEvent函数时,使用QStylePainter绘制。

void Widget::paintEvent(QPaintEvent *) { QStyleOption option; option.initFrom(this); QPainter painter(this); style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this); }

有时候在界面上加了弹簧,需要动态改变弹簧对应的拉伸策略,对应方法为changeSize,很多人会选择使用set开头去找,找不到的。

在使用QFile的过程中,不建议频繁的打开文件写入然后再关闭文件,比如间隔5ms输出日志,IO性能瓶颈很大,这种情况建议先打开文件不要关闭,等待合适的时机比如析构函数中或者日期变了需要重新变换日志文件的时候关闭文件。不然短时间内大量的打开关闭文件会很卡,文件越大越卡。

在很多网络应用程序,需要自定义心跳包来保持连接,不然断电或者非法关闭程序,对方识别不到,需要进行超时检测,但是有些程序没有提供心跳协议,此时需要启用系统层的保活程序,此方法适用于TCP连接。

int fd = tcpSocket->socketDescriptor(); int keepAlive = 1; //开启keepalive属性,缺省值:0(关闭) int keepIdle = 5; //如果在5秒内没有任何数据交互,则进行探测,缺省值:7200(s) int keepInterval = 2; //探测时发探测包的时间间隔为2秒,缺省值:75(s) int keepCount = 2; //探测重试的次数,全部超时则认定连接失效,缺省值:9(次) setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive)); setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle)); setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval)); setsockopt(fd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

如果程序打包好以后弹出提示 This application failed to start because it could not find or load the Qt platform plugin 一般都是因为platforms插件目录未打包或者打包错了的原因导致的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxjpf.html