Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型
继续讲一些Qt技巧操作
1.非必要不用"tr"
如果程序运行场景确定是某一固定语言,就不需要用tr,"tr"之主要针对多语种翻译的,因为tr的本意是包含英文,然后翻译到其他语言比如中文,不要滥用tr,如果没有翻译的需求,禁用tr,tr需要开销的,Qt默认会认为他需要翻译,会额外进行特殊处理。只有比如你的产品要用到不同的语言的国家地区,要实现多语种兼容,这种情况才需要使用“tr”,多语种的实现详见另一篇文章Qt多语种开发教程
2.Qt中的时间类
Qt封装的QDateTime日期时间类非常强大,可以字符串和日期时间相互转换(这是最牛逼,最方便的),也可以毫秒数和日期时间相互转换,还可以1970经过的秒数和日期时间相互转换等。
QDateTime dateTime;
QString dateTime_str = dateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
//从字符串转换为毫秒(需完整的年月日时分秒)
datetime.fromString("2024-09-10 12:07:50:541", "yyyy-MM-dd hh:mm:ss:zzz").toMSecsSinceEpoch();
//从字符串转换为秒(需完整的年月日时分秒)
datetime.fromString("2024-09-10 12:07:50:541", "yyyy-MM-dd hh:mm:ss:zzz").toTime_t();
//从毫秒转换到年月日时分秒
datetime.fromMSecsSinceEpoch(1315194829218).toString("yyyy-MM-dd hh:mm:ss:zzz");
//从秒转换到年月日时分秒(若有zzz,则为000)
datetime.fromTime_t(1315193829).toString("yyyy-MM-dd hh:mm:ss[:zzz]");
3.Qt容器的取值使用
在我们使用QList、QStringList、QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() ,而不是 [] 操作符。一方面使用 at() 效率高于使用 [] 操作符速度,另一方面Qt的容器类[] 操作符可作为右值也能作为左值,他自己不能辨别 ,假设最坏的情况出现并且强制执行深度赋值,而 at() 函数只能作为右值,不允许出现在一个赋值的左边,会帮助你避免这种错误。
4.QDialog窗体的阻塞
如果你某个子窗体是QDialog类型的窗体,你想要在exec以后还能让其他代码继续执行,请在QDialog窗体exec前增加一行代码,否则会阻塞窗体消息.
QDialog myDlg;
//这里加一行避免阻塞窗体消息
myDlg.setWindowModality(Qt::WindowModal);
myDlg.exec();
5.Qt控件类对象的删除
在Qt中,安全的删除Qt的窗体呀控件呀等对象,强烈建议使用deleteLater而不是delete,因为deleteLater会选择在合适的时机进行释放,而delete会立即释放,很可能会出错崩溃(我试过只要调用到delete就直接崩溃)。如果要批量删除对象集合,可以用qDeleteAll,比如 qDeleteAll(btns);
ui->btBack->deleteLater();
ui->labelRemindImg->deleteLater();
ui->cbDetectRemind->deleteLater();
6.玩转QPainter画家类
如果想要做好自定义控件绘制,最好研究下编程中的坐标系,心中有坐标,才能不会乱。同时将qpainter.h头文件中,QPainter类提供的函数接口好好看一遍、试以下,这里几乎包含了所有Qt内置的绘制的接口,如果你能把这些接口用的都很溜。那你界面绘制这块基本就大神了。
7.QString的转换
Qt中,我们经常需要将QString和const char *之间进行转换,尤其是一些传统C++做的库,转换很频繁,这时候最好用toStdString().c_str()而不是toLocal8Bit().constData(),比如在setProperty中如果用后者,字符串中的英文正常,中文就会乱码。
8.用好 QVariant类型
QVariant类型异常的强大,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用,可以说是万能的类型,在进行配置文件的存储的时候,经常会用到QVariant的转换,QVariant默认自带了toString、toFloat等各种转换,基本可以满足各种数值类型的转换兼容。
但是有时候需要从QVariant转到一些特殊的类型,比如QColor,QFont等,却没有提供直接可用的toColor函数,这个时候就要用到特殊方法:
if (variant.typeName() == "QColor")
{
QColor color = variant.value<QColor>();
QFont font = variant.value<QFont>();
QString nodeValue = color.name(QColor::HexArgb);
}