当前位置: 首页 > article >正文

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提供的各种转换接口,这里只截取冰山一角
但是有时候需要从QVariant转到一些特殊的类型,比如QColor,QFont等,却没有提供直接可用的toColor函数,这个时候就要用到特殊方法:

if (variant.typeName() == "QColor")
{
	QColor color = variant.value<QColor>();
	QFont font = variant.value<QFont>();
	QString nodeValue = color.name(QColor::HexArgb);
}

http://www.kler.cn/news/309072.html

相关文章:

  • Vite项目中eslint的简单配置
  • Amazon 正式官宣取消居家上班(WFH)
  • Ubuntu apt 命令全面讲解
  • 行业机遇!程序员:如何选择适合自己的就业方向?
  • linux--防火墙
  • 【Android】处理线程中未捕获的异常
  • python加载chgcar, aeccar压缩数据
  • FRP之简单粗暴官方搭建【超详细教程】【排坑】【包括官网下载地址】【伸手党福利】
  • 容器镜像同步工具image-migrator
  • 第14章 存储器的保护
  • Linux网络子系统TCP篇 二
  • 【PostgreSQL里vacuum但是无法回收死元组的原因】
  • 解决 Docker 端口映射错误:“No public port ‘80’ published”
  • linux驱动开发-内核并发控制
  • 【网络安全】分享4个高危业务逻辑漏洞
  • 软件测试工程师面试整理-测试工具
  • unity UnityWebRequest 的request.downloadHandler 空应用
  • 承压设备032认证-全网最全解读
  • 随笔十一、wsl子系统ubuntu磁盘清理
  • 在Ubuntu 18.04上安装R的方法
  • navicate远程linux上的pgsql提示密码失败
  • Effective C++笔记之二十三:非void函数不写return
  • 基于STM32的非接触式红外测温系统
  • 采用qt做一个命令行终端
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-17
  • Vue点击按钮生成pdf文件/Vue点击按钮生成png图片
  • AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理
  • SAM 2: Segment Anything in Images and Videos
  • c语言中“typedef”关键字,对类型进行重命名
  • 渗透测试入门学习——php文件上传与文件包含