Qt数据类型与强制转换(整理)
变量(Variable)和对象(Object)
在python中的变量不需要声明,因为python是动态语言。python中所有的东西都是对象。
数字(Number)和字符(String)
在python中包括几种(整数、浮点数、长整数)数字类型和两种字符类型。
整数(Integer)和长整数(Long Integer)
Python提供了三种整数类型:bool,int和long。bool类型只有两个值True和False,在数值环境中被当作1和0对待。long类型支持的数字的大小仅受机器内存大小的限制。使用long类型的例子:q=7L。唯一不足的是:long类型比int类型慢。
浮点数(Float)和小数(Decimal)
Python提供了三种浮点值:float,Decimal和complex。其中float的值为双精度浮点数,表示的范围决定于编译python的C(或Java)编译器。由于计算机表示浮点数的方式的原因,会导致小的误差。float使用64位表示浮点数。如果需要更高的精确度,可以使用decimal模块中的Decimal数字(默认使用28位表示小数部分)。但是运行的时候比float慢很多。Decimal数字适用于金融计算。
使用Decimal的例子:
import decimal
decimal.Decimal("5.1")
decimal.Decimal("8.9e-4")
Python也提供了内建的复数类型:complex。但是使用j作为虚数单位。例如:c=5.4+0.8j。
字节字符串(Bytestring),Unicode字符串(Unicode String)和QString
Python中有两种内建的字符串:str(表示字节字符串)和unicode(表示Unicode字符)。PyQt提供了第三种字符串类型:QString。
the safest route is to use strs for 7-bit ASCII and for raw binary 8-bit bytes, and unicode or QString otherwise.
集合(Collection)
内建的集合类型有:tuple(元组)、list(列表)、dict(字典)、set和frozenset。其中tuple和frozenset是不可变的,其它都是可变的。
在Python标准库中有一个集合类型,此类型不包含类型索引,而是包含指定类型的数字。这就是array类型。它使用在需要存储大量的数字并且运行效率尽可能高的情况下。
元组(Tuple)
元组表示的是一个包含零个或更多个对象索引的有序序列。元组支持序列函数(如len())。这使得我们从元组中提取项目十分容易。然而,由于元组是不可变的,所以我们不能替换或者删除其中的项目。但我们可是通过把元组转换成列表间接实现此目的。
创建元组时,使用与不使用圆括号“()”都可以得到一个元组,这是没有区别的。
例如:
ex1=a,b,c
ex2=(a,b,c)
是一样的。
列表(List)
列表是与元组类似的有序序列。在字符串和元组中使用的序列函数及切片工具均严格适用于列表。与元组的区别是,列表可变,拥有可以用来改变它的函数。创建列表的时候,必须方括号“[]”或者使用list()构造器。
字典(Dictionarie)
dict类型是一个数据字典,也被看成联合数组。字典包含一组无序的“键—值”对以及提供快速的键查询。字典中的键必须是唯一的,并且是不可变的,如元组、字符串或数字;值可以是任意类型。它和Perl中的hash、Java中的HashMap和C++中的unordered_map类似。
字典可以使用dict()构建器构建。
集合(Set)(和数学上的集合定义比较接近)
Python提供了两种set类型:set和frozenset。它们都是无序的,因此都不是序列。Set可变,它的项目可增加或移除。Frozenset不可变,不能被改变。所以,Frozenset也能用作字典的“键”。
Set中的项目是唯一的;试图增加一个已存在于set中的项目到set中,add()方法将什么也不做。包含相同项目的两个set相等,而不管其中项目的插入顺序。set和只有“键”而无“值”的字典类似。
frozenset可以使用单一的序列参数创建,例如,元组或列表。set也可以使用相同的方式创建。
例如:
unicorns = set(("Narwhal","Oryx","Eland"))
如果创建的是set对象,那么就可使用add()和remove()方法来增加和移除set中的项目了。
内建函数(Build-in Function)
Python中有大量的内建函数和操作符:例如,del,print,len(),type(),help(),dir(str), range(), open(), hasattr(), isinstance(), max(), min()
与set相关的一些内建函数与操作符:
in,not in,len(), clear(), copy(), add(), remove(), discard(), issubset(), issuperset(), union(), intersection(), difference()
一些与序列(元组,列表,字典)相关的内建函数与操作符:
all, any, in, not in, len(), max(), min(), sum()
一些数学相关的内建函数
abs(),divmod(i,j),hex(i),oct(i),float(x),int(x),long(x),pow(x,y),round(x,n)
类型转换
把QString转换为 double类型
方法1.QString str="123.45";
double val=str.toDouble(); //val=123.45
方法2.很适合科学计数法形式转换
bool ok;
double d;
d=QString("1234.56e-02").toDouble(&ok); //ok=true;d;12.3456.
把QString转换为float形
1.QString str="123.45";
float d=str.toFloat(); //d=123.45
2.QString str="R2D2";
bool ok;
float d=str.toFloat(&ok); //转换是被时返回0.0,ok=false;
把QString形转换为整形
1.转换为十进制整形
注意:基数默认为10。当基数为10时,并且基数必须在2到36之
间。如果基数为0,若字符串是以0x开头的就会转换为16进制,若以0开头就转换为八进制,否则就转换为十进制。
Qstring str="FF";
bool ok;
int dec=str.toInt(&ok,10); //dec=255 ; ok=rue
int hex =str.toInt(&ok,16); //hex=255;ok=true;
3.常整形转换为Qstring形
long a =63;
QString str=QString::number(a,16); //str="3f";
QString str=QString::number(a,16).toUpper(); //str="3F";
Qstring 转换char*问题!
方法一:
QString qstr("hello,word");
const char * p = qstr.toLocal8Bit().data();
方法二:
const char *p = qstr.toStdString().data();
转换过来的是常量
把当前时间转化为QString...
public QDateTime qdate = QDateTime.currentDateTime();
datetime = qdate.toString("yyyy年MM月dd日ddddhh:mm:ss");
如果不是QTime和QDate类比如说:通过TCP/IP接收到的char unsigned char 类等如何转换为QString类
QString Time2String( DWORD dwTime)
{
char cTime[50] = {0};
memset(cTime,0,50);
strftime(cTime,32,"%Y-%m-%d %H:%M:%S",localtime(&time_t(dwTime)));
return QString(cTime);
}
最后补充的 QString转换为char*
QString str1 = "Test";
QByteArray ba = str1.toLatin1();
const char *c_str2 = ba.data();
printf("str2: %s", c_str2);
由于经常使用C/C++类型,最后又要将其显示到界面上,所以会经常用到转换成QString方法,如果是char型比较好办,其他类型则会用到arg方法
char* 转 QString:
- char port[10] = "COM3";
- QString szPort = QString(port);
int 转 QString :
- int index=1;
- QString szId = QString::number(index);
float/double 转 QString :
- float fSpeed = 3.2;
- QString szSpeed = QString::number( fSpeed, 'f', 2 ); //szSpeed的内容为"3.20"
多个变量 到 QString:
- char port[10] = "COM2";
- int baudrate = 9600;
- QString szFailed = QString("Open %1 baudrate %2 failed!").arg(port).arg(baudrate);
中文 到 QString:
- QString szOpened = QString::fromLoacal8Bit("打开串口");
中文和变量组合 到 QString:
- char port[10] = "COM2";
- int baudrate = 9600;
- QString szFailed = QString::fromLoacal8Bit("打开串口%1, 波特率%2").arg(port).arg(baudrate);