Qt开发技巧(五)Qt信号槽的传递,QZipReader和QZipWriter的应用,不要再窗体构造时获取其尺寸,让Qt自动关联信号槽,用QTextStream操作文件,子项目嵌套

继续讲一些Qt技巧操作:
1.Qt信号槽的传递
Qt中的信号槽是Qt核心中的核心,可以说信号槽机制是支撑起Qt广泛应用的支柱之一。有时候我们在很多窗体中传递信号来实现更新或者处理,如果窗体层级比较多,比如窗体A的父对象是窗体B,窗体B的父对象是窗体C,窗体C有个子窗体D,如果窗体A一个信号要传递给窗体D。
像这样
问题来了,必须先经过窗体B中转到窗体C再到窗体D才行,这样的话各种信号关联信号的connect会非常多而且管理起来比较乱,可以考虑增加一个全局的单实例类AppSignalSlot(自己随便命名),公共的信号放这里,然后窗体A对应信号绑定到AppSignalSlot,窗体D绑定AppSignalSlot的信号到对应的槽函数即可,干净清爽整洁。

2.QZipReader和QZipWriter的应用
Qt源码中内置了一些未公开的不能直接使用的黑科技,都藏在对应模块的private中,比如guiprivate widgets-private等,比如zip文件解压类QZipReader、压缩类QZipWriter就在gui-private模块中,需要在pro中引入QT += gui-private才能使用。

#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"
QZipReader reader(dirPath);
QString path("");
//解压文件夹到当前目录
reader.extractAll(path);
//文件夹名称
QZipReader::FileInfo fileInfo = reader.entryInfoAt(0);
//解压文件
QFile file(filePath);
file.open(QIODevice::WriteOnly);
file.write(reader.fileData(QString::fromLocal8Bit("%1").arg(filePath)));
file.close();
reader.close();
QZipWriter *writer = new QZipWriter(dirPath);
//添加文件夹
writer->addDirectory(unCompress);
//添加文件
QFile file(filePath);
file.open(QIODevice::ReadOnly);
writer->addFile(data, file.readAll());
file.close();
writer->close();

3.不要再窗体构造时获取其尺寸
在构造函数中获取控件的宽高很可能是不正确的,因为窗体还没构造完成,这时候本身其尺寸就是一个概念,好比一个少年还没成年,他的身高不是定值,他可能还会长高。需要在控件首次显示以后再获取才是正确的,控件是在首次显示以后才会设置好正确的宽高值,记住是在首次显示以后,而不是构造函数或者程序启动好以后,如果程序启动好以后有些容器控件比如QTabWidget中的没有显示的页面的控件,你去获取宽高很可能也是不正确的,万无一失的办法就是构造完成后,首次显示结束再去获取。
4.让Qt自动关联信号槽
Qt支持所有的界面控件比如QPushButton、QLineEdit自动关联 on控件名信号(参数) 信号槽,比如按钮的单击信号 on_pushButton_clicked(),你可以在界面设计器上,右键按钮,转到槽,选择你要的槽函数,Qt直接跳转到为你实现的槽函数体内,并做好自动关联,你只需要实现槽函数功能即可。
在这里插入图片描述
这样做的好处不但可以不用自己connect从而提高开发效率,也能快捷的找到对应窗体的槽函数,特别是窗体比较多的时候。

5.用QTextStream操作文件
用QFile读写文件的时候,可以使用QTextStream文件流的方式来读写文件,速度快很多,别人说速度至少会有30%的提升,文件越大性能区别越大,可以试试。

//从文件加载英文属性与中文属性对照表
QFile file(":/propertyname.txt");
if (file.open(QFile::ReadOnly)) {
//QTextStream方法读取速度至少快百分之30
#if 0
while(!file.atEnd()) {
QString line = file.readLine();
appendName(line);
}
#else
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
appendName(line);
}
#endif
file.close();
}

6.子项目嵌套
在一些大的项目中,可能嵌套了很多子项目,这时候会经常遇到某些子项目依赖其他子项目的情况,比如某部分的子项目用来生成动态库,另一部分子项目依赖这个动态库进行编译,此时就需要各个子项目按照顺序编译或者设置好依赖规则。

TEMPLATE = subdirs
#设置ordered参数以后会依次编译 projA projB projC
CONFIG += ordered
SUBDIRS += projA
SUBDIRS += projB
SUBDIRS += projC
#还可以通过设置depends指定某个项目依赖 比如下面指定projB依赖projA
projB.depends = projA
projC.depends = projA
projD.depends = projC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值