Qt使用小技巧记录

字符串国际化tr()

函数tr()的原型是QObject::tr(),被它处理的字符串可以使用工具提取出来翻译成其他语言,也就是国际化使用。如果想让你的程序实现国际化,那么就在用户所有可见的字符串处都使用QObject::tr()! 但是我们在使用的过程中通常是使用tr(),而并非是QObject::tr(),这是为什么呢?原来,tr()函数是定义在QObject里面的,所有使用了Q_OBJECT宏的类都自动具有tr()的函数。和connect函数一样,都是继承了QObject所以能够直接使用。

指向QApplication对象的全局指针qApp

qApp,#include < QApplication >

A global pointer referring to the unique application object.
It is equivalent to QCoreApplication::instance(), but cast as a QApplication pointer, so only valid when the unique application object is a QApplication.

qApp是一个指向独一无二的application对象的全局指针,也就是指向main.cpp里创建的QApplication对象。

//main.cpp
#include "langswitch.h"

#include <QApplication>
#include<QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << "main:"<< &a;
    LangSwitch w;
    w.show();
    return a.exec();
}
//langswitch.cpp文件
#include <QApplication>
#include<QDebug>
LangSwitch::LangSwitch(QWidget *parent)
    : QWidget(parent)
{
    createScreen();
    qDebug() << "LangSwitch:"<< qApp;
}

输出结果:

main: QApplication(0x76fd20)
LangSwitch: QApplication(0x76fd20)

可以看到它们的地址是相同的,指向同一个QApplication对象。

QTimeLine

QTimeLine类提供用于控制动画的时间表,通常用于定期调用插槽来为GUI控件创建动画。简单来说,就是可以通过 QTimeLine 来快速的实现动画效果,其原理就是在指定的时间内发出固定帧率的信号,通过连接该信号去改变目标控件的值,由于时间断帧率高,所以整体看起来就是连续的动画效果。
链接:Qt时间轴QTimeLine的基本用法

实现图元动画显示两种方式

  • 一种是利用GRaphicsItemAnimation 类和QTimeLine类实现;
  • 一种是在图元类中利用定时器QTimer和图元的重绘事件paint()实现;

在终端窗口中输出

在Qt中使用printf函数,但应用程序输出窗口中无显示,打开Run in terminal即可
在这里插入图片描述

qint8/qint16等类型

它们都是Qt中为一些基本数据类型起的别名,最后的数字代表位数。

typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
typedef long long qint64;           /* 64 bit signed */
typedef unsigned long long quint64; /* 64 bit unsigned */

qreal类型

在Qt助手中可以看到:

typedef qreal
Typedef for double unless Qt is configured with the qreal float option.
除非用户自己配置qreal为float,否则qreal将默认为double。

在源码qglobal.h中有更清楚的表示:

#if defined(QT_COORD_TYPE)
typedef QT_COORD_TYPE qreal;
#else
typedef double qreal;
#endif

所以qreal就是double的别名。
在桌面操作系统中(比如Windows, XNix等)qreal其实就是double类型;而在嵌入设备系统中,qreal则等同于float 类型。 (在Arm平台上,qreal相当于float)

QRectF()和QRect()

QRect r1(100, 200, 11, 16);
QRect r2(QPoint(100, 200), QSize(11, 16));
 QRectF r1(100.0, 200.1, 11.2, 16.3);
 QRectF r2(QPointF(100.0, 200.1), QSizeF(11.2, 16.3));

QRectF()和QRect()都是用来表示矩形,不过QRectF()的点坐标和尺寸可以是浮点类型。而QRect()的点坐标和长宽要是ing类型。

正则表达式

正则是一种规则,它用来匹配(进而捕获、替换)字符串。这种规则需要“模式”、“字符串”这两样东西,“模式”根据正则规则,来处理“字符串”。

这种规则被许多语言支持,C++11以后才支持正则。

ECMAScript支持的正则

正则由元字符和普通字符组成。普通字符就代表它原本的含义;元字符的意义不同于该字符本来的含义,而是有特殊的意义和功能。

根据其意义功能划分,可将元字符划分为:

具有特殊意义的元字符

\\字符能够改变字符原本的含义

^^字符指示字符串的头,且要求字符串以字符开头,不占位。\^表示一个真正的^符号。

$$字符指示字符串的尾,且要求字符串以字符结尾,不占位。\$表示一个真正的$符号。

、():分组,大正则中包含小正则。可以改变默认的优先级。在模式中可以使用\1来表示第一组已然捕获到的东西。

\b:指示字符串的边界(头/尾/空格左/空格右),字符\b要求边界的左边是字符\b字符要求边界的右边是字符

.:表示一个除了\n以外的任意一个字符。\.表示一个真正的.符号。

|字符串1|字符串2表示一个字符串,该字符串是字符串1、字符串2中的一个。|在正则中的优先级比较混乱,所以建议加上足够多的括号来分组。

[][字符1字符2字符3...]表示一个字符,该字符是字符1、字符2、字符3……中的某一个。中括号中出现的所有字符都是代表本身意思的字符(没有特殊含义),如[.]只能匹配.符号,而不能匹配任意符号。

[^字符1字符2字符3...]表示一个字符,该字符不是字符1、字符2、字符3……中的任何一个

[a-z]表示一个字符,该字符是a、b、c……z中的某一个

[^a-z]表示一个字符,该字符不是a、b、c……z中的任何一个

\w:表示一个字符,该字符是数字、字母、下划线中的某一个。等价于[(0-9)(a-z)(A-Z)(_)]

\W:表示一个字符,该字符不是数字、字母、下划线中的任何一个。等价于[]

\d表示一个字符,该字符是0、1、2……9中的某一个

\D表示一个字符,该字符不是0、1、2……9中的任何一个

\s表示一个字符,该字符是空白符(空格、制表符、换页符)2、代表出现次数的

量词元字符

*字符*要求字符出现0到多次

+字符+要求字符出现1到多次

?字符?要求字符出现0次或1次

{n}字符{n}要求字符出现n次

{n,}字符{n,}要求字符出现n到多次

{n,m}字符{n,m}要求字符出现n到m次、

C++支持的正则

C++可以支持ECMAScript支持的正则,也可以支持grep支持的正则等等。

Qt中使用正则表达式控制输入

QRegExp regExp("[A-Za-z]+[1-9][0-9]{0,2}");
ui->lineEdit->setValidator (new QRegExpValidator(regExp,this));

[ A-Za- z]+[1-9][0-9]{0,2}的意思为:第一个输入的要是大小写字母,可以输入1个到多个,接下来可以输入数字1到9中的一个,接下来可以输入0到9中的数字0到2次。所以,最少要输入一个字母,最多可以输入3个数字。

Qt中的隐式共享

隐式共享又称为回写复制(copy on write)。当两个对象共享一份数据时(通过浅拷贝实现数据块的共享),如果数据不改变,则不进行数据的复制。当某个对象需要改变数据时,则执行深拷贝。
隐式共享将深拷贝和浅拷贝有机结合起来,降低对内存和CPU资源的使用,提高程序的运行效率。它使得在函数中使用值传递更有效率。
隐式共享的关键在于引用计数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值