Qt-常用数据类型

2023-10-30

常用基本数据类型

类型名称 注释 备注
qint8 signed char 有符号8位数据类型
qint16 signed short 有符号16位数据类型
qint32 signed int 有符号32位数据类型
qint64 long long int(或__int64) 有符号64位数据类型
qintptr qint32 或 qint64 指针类型,用于带符号整型。 (32位系统为qint32、64位系统为qint64)
qlonglong long long int 或(__int64) 和qint64定义一样
qptrdiff qint32 或 qint64 表示指针差异的整型。32位系统为qint32、64位系统为qint64
qreal double 除非配置了-qreal float选项,否则默认为double
quint8 unsigned char 无符号8位数据类型
quint16 unsigned short 无符号16位数据类型
quint32 unsigned int 无符号32位数据类型
quint64 unsigned long long int 或 (unsigned __int64) 无符号64位数据类型,Windows中定义为unsigned __int64
quintptr quint32 或 quint64 指针类型,用于无符号整型。32位系统为quint32、64位系统为quint64
qulonglong unsigned long long int 或 (unsigned __int64) 和quint64定义一样
uchar unsigned char 无符号字符类型
uint unsigned int 无符号整型
ulong unsigned long 无符号长整型
ushort unsigned short 无符号短整型

QByteArray

QByteArray提供了一个【字节】数组,既可以储存原始字节(包括‘\0’),又可以储存惯例上8位以’\0’结尾的字符串(字符数组)。

Qt中的QByteArray储存的十六进制数是0xFF,实际是以ASCII码储存的,储存形式为‘\xFF’,所以如果需要比较的话,需要用array.at(0)=='\xff’表示,而不是array.at(0)==0xFF。

构造函数

一种初始化QByteArray方式是给他的构造函数传入一个const char*即可,此时执行了深度拷贝。

如果出于效率问题不想进行深度拷贝,则使用QByteArray::fromRawData(const char * data, int size)。返回的对象直接和数据指针产生关联。注意:通过这种方式创建时,不包含尾随的终止符,QByteArray不会自动添加,除非通过深度拷贝。

访问和赋值

访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:

QByteArray ba; 

ba.resize(6); 
ba[0] = 0x3c; 
ba[1] = 0xb8; 
ba[2] = 0x64; 
ba[3] = 0x18; 
ba[4] = 0xca; 
ba.data()[5] = 0x31; 
qDebug()<<"[]"<<ba[2]; //[] d 
qDebug()<<"at()"<<ba.at(2); //at() d 
qDebug()<<"data()"<<ba.data()[2]; //data() d 
qDebug()<<"constData()"<<ba.constData()[2]; //constData() d 
qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1

一次取出多个字符

  • QByteArray QByteArray::left(int len) const:从最左边开始取出len长度的字符
  • QByteArray QByteArray::right(int len) const:从最右边开始取出len长度的字符
  • QByteArray QByteArray::mid(int pos, int len = -1) const:从pos开始,返回指定长度的数组,如果len=-1(默认)或者pos+len>size(),则返回从指定pos开始到数组尾的所有字节。

获取数据指针

  • char* QByteArray::data() /* return a pointer to the data stored in the byte array */
  • const char* QByteArray::constData() const /* return a pointer to the data stored in the byte array */

通过data()或者constData()可以获取QByteArray的真实数据指针。

修改字节的方法

QByteArray提供了很多修改字节的方法:append()、prepend()、insert()、replace()、remove()。

hex转换

把Hex编码转换为char存储到QByteArray:

QByteArray text = QByteArray::fromHex("517420697320677265617421"); 
text.data();      
// returns "Qt is great!"

把QByteArray转为Hex编码:

QByteArray ba; 
ba.resize(3); 
ba[0] = 0x30; 
ba[1] = 0x31; 
ba[2] = 0x32; 
qDebug() << ba.toHex(); //return "303132"

数值转换与输出

尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

把单个字符转为2-36进制数据格式:

int n = 63; 
qDebug()<<QByteArray::number(n);        
// returns "63" 
qDebug()<<QByteArray::number(n, 16);      
// returns "3f" 
qDebug()<<QByteArray::number(n, 16).toUpper();  
// returns "3F" 
qDebug()<<QByteArray::number(n, 2);      
// returns "111111" 
qDebug()<<QByteArray::number(n, 8);      
// returns "77"

按照指定进制格式直接复制,其中n可以是各类常见数值类型:

QByteArray ba; 

int n = 63; 
ba.setNum(n);      // ba == "63" 
ba.setNum(n, 16);    // ba == "3f"

把数值按指定格式和小数位转换输出,小数位四舍五入:

QByteArray ba1 = QByteArray::number(12.3456, 'E', 3); 
QByteArray ba2 = QByteArray::number(12.3456, 'f', 3); 
qDebug()<<ba1; // returns "1.235E+01" 
qDebug()<<ba2;  // returns "12.346"

字符串数值转换为各类数值

QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

QByteArray strInt("1234"); 
bool ok0; 
qDebug() << strInt.toInt();  // return 1234 
qDebug() << strInt.toInt(&ok0,16);  // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660  
QByteArray string("1234.56"); bool ok1; qDebug() << string.toInt();  // return 0, 小数均视为0 
qDebug() << string.toInt(&ok1,16);  // return 0, 小数均视为0 
qDebug() << string.toFloat();  // return 1234.56 
qDebug() << string.toDouble();  // return 1234.56  
QByteArray str("FF"); 

bool ok2; 
qDebug() << str.toInt(&ok2, 16);   // return 255, ok2 == true 
qDebug() << str.toInt(&ok2, 10);   // return 0, ok == false, 转为十进制失败

大小写转换

QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下:

QByteArray x("Qt by THE QT COMPANY"); 
QByteArray y = x.toLower(); // y == "qt by the qt company"  
QByteArray z = x.toUpper(); // z == "QT BY THE QT COMPANY"

与字符串互转

QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表。

字符型

QByteArray转为QString示例:

QByteArray ba("abc123"); QString str = ba; //或str.prepend(ba); qDebug()<<str ; //输出:"abc123"

QString转为QByteArray示例:

QString str("abc123"); QByteArray ba = str.toLatin1(); qDebug()<<ba; //输出:"abc123"

数组型

QByteArray数组转为QString字符串,中间加入空格:

log.append(serialPort->recvDataArray->toHex(' ')); qDebug() << log.toUpper();

QString字符串转为QByteArray数组,中间去掉空格:

QString text = tEditSource->toPlainText().remove(QRegExp("\\s")); 
QByteArray array; ok; 
arrasize(text.length() / 2); 
for (int 0; i < text.count();) {      
	ardata() = (uint8_t)text.mid(i, 2).toInt(&ok, 16);      
	i += 2; 
}

与自定义结构体之间的转换

结构体转QByteArray

SHT30RecvBufferTypedef sendBuffer; 
sendBuffer.tempH = 0x01; 
sendBuffer.tempL = 0x02; 
sendBuffer.tempCRC = 0x03; 
sendBuffer.humiH = 0x04; 
sendBuffer.humiL = 0x05; 
sendBuffer.humiCRC = 0x06;  
QByteArray sendByte; 
sendByte.append((char*)&sendBuffer, sizeof(sendBuffer));

QByteArray转结构体

SHT30RecvBufferTypedef *SHT30RecvBuffer = (SHT30RecvBufferTypedef*)buf.data();

拼接2个QByteArray

QByteArray x("free"); 
QByteArray y("dom"); 
x.append(y); 
// x == "freedom"

截取部分字节组成新的QByteArray

可以调用mid函数,从哪个pos开始截取,截取的长度是多少。

QByteArray x("Five pineapples"); 
QByteArray y = x.mid(5, 4);   
// y == "pine" QByteArray z = x.mid(5);    
// z == "pineapples"

带空格字符串转hex

void String2Hex(QString str, QByteArray *sendData) {
   	    QString str1 = str.trimmed();
   	    sendData->resize((str1.length() + 1) / 3);
   	    int index = 0;   	    
   	    bool ok;    	    
   	    for (int i = 0; i < str1.length();)   	
   	    {     		        
	   	    sendData->data()[index] = str1.mid(i , 2).toInt(&ok, 16);          
	   	    index++;     		        
	   	    i += 3;   	    
   	    } 
}

QBuffer

QBuffer类是一个操作QByteArray的输入、输出设备的接口。

构造函数:QBuffer(QByteArray *byteArray, QObject *parent = 0)

QBuffer类用来读写内存缓存。在使用之前需open()来打开缓存并设置模式(只读、只写等)。

QDataStream和QTextStream也可以使用一个QByteArray参数来构造,这些构造函数创建并且打开一个内部的QBuffer。

QDataStream(QByteArray *a, QIODevice::OpenMode mode)

QTextStream(QByteArray *a, QIODevice::OpenMode mode = QIODevice::ReadWrite)

QdataStream(QByteArray *a, QIODevice::OpenMode mode)

QVector

QVector是Qt对所有数组的封装。

比如定义一个int类型的数组,原先可以int array[10],在Qt中可以QVector array(10),赋值时依然可以array[5] = 4,读取时也可以a = array[9]。和原先的用法一致。

QVector的好处:

  • 可以用count()函数获取数组的大小,方便遍历。(普通数组必须先预定义好数组大小,虽然QVector最好也要预定义大小,但是也可以不预定义)
  • 可以用append()函数或者<<操作符,来往数组最后添加元素而不用担心溢出问题。

使用

添加头文件

#include <QVector>

构造

QVector<int> vector;
for(int i = 0; i < 10; ++i) vector << i + 1;
 
//构造
QVector<int> myVector1(5);      //开辟5个大小的空间
QVector<int> myVector2(5,1);    //5个值,都是1
QVector<int> myVector3(vector); //用另一个QVector初始化

添加

QVector<QString> strArray; 
strArray.append("Hello"); 
strArray << "world"; strArray << "MyName" << "is" << "LEO"; 
/* 现在strArray总共有5个元素,strArray.count() == 5 */

QVector<int> myVector;
myVector.push_back(5);  //在数组后添加元素
myVector.push_front(4); //在数组首位置添加元素
myVector.prepend(3);    //在数组首位置添加元素
myVector.append(6);     //在数组最后添加元素
myVector << 7;          //在数组最后添加元素
myVector.insert(0,2);   //在数组位置0,添加元素
myVector.insert(0,2,1); //在数组位置0,添加2个值为1的元素
myVector.insert(myVector.end(),8);      //在数组最后,添加元素
myVector.insert(myVector.end(),2,9);    //在数组最后,添加2个值为9的元素
qDebug() << myVector;

删除

//删除
myVector.clear();
myVector << vector;
myVector.remove(0,2);   //从位置0开始,移除2个元素
myVector.remove(0);     //移除位置0的元素
qDebug() << myVector;
myVector.pop_back();    //移除最后一个元素
myVector.pop_front();   //移除第一个元素
myVector.clear();
myVector << vector;
myVector.erase(myVector.begin());//移除某位置的元素
myVector.erase(myVector.begin(),myVector.end());//移除区间所有元素
qDebug() << myVector;

//改
myVector.clear();
myVector << vector;
myVector.replace(0,10);//位置0上的元素,用10来代替
qDebug() << myVector;

查找

qDebug() << myVector.indexOf(2,0);//从位置0开始,查找元素2,返回下标
qDebug() << myVector.lastIndexOf(2,1);//从右向左数,位置0开始查找元素2,返回下标
qDebug() << myVector.startsWith(2);//判断,第一个元素是否是2
qDebug() << myVector.endsWith(2);//判断,最后一个元素是否是2

取值

qDebug() << myVector.front(); //第一个元素
qDebug() << myVector.first(); //第一个元素
qDebug() << myVector.last(); //最后一个元素
qDebug() << myVector.mid(1,3); //取位置1后,3个元素

遍历

QVector<QString>::iterator iter; 
for (iter = strArray.begin(); iter != strArray.end(); iter++) {   	    
	qDebug() << *iter << "\0"; 
}

转换

//将QVector转为stdVector
std::vector<int> stdVector = myVector.toStdVector();
 
//将QVector转为QList
QList<int> list = myVector.toList();
qDebug() << list;
 
//将stdVector转为QVector
myVector.clear();
myVector = QVector<int>::fromStdVector(stdVector);
qDebug() << myVector;
 
//将QList转为QVector
myVector.clear();
myVector = QVector<int>::fromList(list);
qDebug() << myVector;

取代

/* 元素位置1被替代 */ 
strArray.replace(1, "LEO");

其他

myVector.squeeze(); //释放不需要存储项的内存
qDebug() << myVector.data(); //首地址
qDebug() << myVector.capacity(); //内存大小
myVector.clear(); //清空内存

在上述这些函数中,除了append和replace这两个函数外,其他函数会比较慢。因为其他函数在内存中移动一个位置时,会使向量容器内的对象移动多次。如果想要一个能在中间快速插入和删除元素的容器时,可以使用QList或QLinkedList。

调用at()函数来读取对象时,会比调用operator()函数读取速度更快,因为不会使用深度复制(deep copy)。

调用data()函数可以访问保存在QVector的数据,这个函数会返回指向向量容器的第一个对象的指针。可以使用该指针访问和修改向量容器内的对象。可以使用指针将向量容器传递给接收的普通C++数组的函数。

contains()函数用来查找向量容器内是否包含某个对象。

count(“对象”)函数可以找出某个对象在向量容器中出现的次数。

resize()函数可以在任何时候改变QVector向量容器的体积。如果新的向量容器体积比之前的大,QVector也许会重新分配整个向量容器。QVector会预先分配2倍于实际数据大小的空间,从而减少再分配次数。

reserve()函数,如果事先知道向量容器大概包含多少个对象,可以使用这个函数来预先分配好一定的内存大小。

capacity()函数返回改向量容器所占的内存的实际大小空间。

QString

Qt中提供了QString类来储存字符串,大部分情况下,我们都是在使用QString。

QString储存了16位的unicode码,很容易储存非ASCII码或者非Lantin1编码,另外QString在所有Qt API中都是通用的。

其他类型转换为QString

原始转换

QString data = QString("%1").arg(num);

上面这样写法会保留全部小数,如果要保留指定小数位

QString::number(tempHumiValueTable[0]->getTemp(),'f',1)

QString::number函数转换

QString::number是将数数字(整数、浮点数、有符号、无符号等)转换为QString类型,常用于UI数据显示。查看API接口,number提供如下几种类型的转换,适合各种场合调用。

static QString number(int, int base=10);
static QString number(uint, int base=10);
static QString number(long, int base=10);
static QString number(ulong, int base=10);
static QString number(qlonglong, int base=10);
static QString number(qulonglong, int base=10);
static QString number(double, char f='g', int prec=6);

第一个参数:待转换数字
第二个参数(整型):转换进制
第二个参数(浮点数):浮点数格式
第三个参数(浮点数):保留小数位数
默认情况下是十进制显示方式转换,也可以使用八进制、十六进制显示方式调用。

QString::number 整数转换

int a = 20;
uint b =255;
QString::number(a);			/* 20 */
QString::number(a,10);		/* 20 */
QString::number(b);			/* 255 */
QString::number(b,16);		/* ff */

QString::number 浮点数转换

1)保留2位小数

float a = 1.234;
QString::number(a,'f', 2);  /* 1.23 */
float a = 1;
QString::number(a,'f', 2);  /* 1.00 */

保留2位有效数字,以简单方式表示,或者科学计数法表示

float a = 0.00001;
QString::number(a, 'g', 2); 	/* 1e-5 */
float a = 0.00012;
QString::number(a, 'g', 2); 	/* 1.2e-4 */

保留指定位数(如001)

整数转换为字符串,并保留3位,不足在前面补0,这一块其实属于“sprintf”格式函数的范畴:

int a=1;
QString str=QString::number(a).sprintf("%03d",a);
//或者
/* a:要转换的值,3:转换结果的数据位数,10:十进制(16进制对应16),空缺补充的字节 */
QString str=QString("%1").arg(a, 3, 10, QChar('0'));

QString转换为其他类型

QString转换为float

QString data; float num = data.toFloat();

判断2个QString相等

QString str = QString::fromLocal8Bit("球形"); 
if(str.compare(QString::fromLocal8Bit("球形") == 0) 
{  }      
或者:    
if(str ==QString::fromLocal8Bit("球形")) 
{  }

与十六进制数相互转换

QString转int

QString hexstr = "0xFF";
bool ok; 
int hexnum = hexstr.toInt(&ok,16); // 表示以16进制方式读取字符串 qDebug()<<hexnum<<<endl;  
/* 输出255 */

int转十六进制字符串

int hexnum = 255; 
QString hexstr = QString::number(hexnum,16);
//表示转换成16进制存入字符串 qDebug()<<hexstr<<endl;		
/* 输出FF */

QString中,涉及到类型转换的函数如下:

short toShort(bool *ok=nullptr, int base=10) const; 
ushort toUShort(bool *ok=nullptr, int base=10) const; 
int toInt(bool *ok=nullptr, int base=10) const; 
uint toUInt(bool *ok=nullptr, int base=10) const; 
long toLong(bool *ok=nullptr, int base=10) const; 
ulong toULong(bool *ok=nullptr, int base=10) const; 
qlonglong toLongLong(bool *ok=nullptr, int base=10) const; 
qulonglong toULongLong(bool *ok=nullptr, int base=10) const; 
float toFloat(bool *ok=nullptr) const; 
double toDouble(bool *ok=nullptr) const;

以及

static QString number(int, int base=10); 
static QString number(uint, int base=10); 
static QString number(long, int base=10); 
static QString number(ulong, int base=10); 
static QString number(qlonglong, int base=10); 
static QString number(qulonglong, int base=10); 
static QString number(double, char f='g', int prec=6);

其中的base便是设置转换方式以n进制为标准,默认为10进制。

转换为16进制和2进制等字符串,并自动填0

函数原型

QString	arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(uint a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(long a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(ulong a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(qlonglong a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(qulonglong a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(short a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(ushort a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(QChar a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(char a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ' ' )) const;
QString	arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1, QChar fillChar = QLatin1Char( ' ' )) const

实例

typedef unsigned char   uint8; 
QString strShowHex,strShowBin; 
uint8 val = 0xfc; 
//16进制 strShowHex = QString("0x%1").arg(int(val), 4, 16, QLatin1Char('0')); 
//显示结果为: 0x00fc 
//2进制 
strShowBin = QString("%1 b").arg(int(val), 8, 2, QLatin1Char('0')); 
//显示结果为: 11111100 b

字串追加

str添加到字符串中并且返回结果的引用。

函数原型

QString & QString::append(const QString & str)

例子

QString string = "Test"; string.append( "ing" );     // string == "Testing"

字符串占位

原型

QString QString::arg(const QString & a, int fieldwidth = 0) const

这个函数将返回使用a来替换最低层出现的%i(i为’1’或’2’或……‘9’)的字符串。

fieldwidth值指定了填充到a中的最小空间。正值将产生右对齐文本,负值将产生左对齐文本。

QString firstName( "liu" ); 
QString lastName( "yong" ); 
QString fullName; 
fullName = QString( "First name is '%1', last name is '%2'" ).arg( firstName ).arg( lastName ); // fullName == First name is 'liu', last name is 'yong'

字符串索引

原型

QChar QString::at(uint i) const

返回在索引i处的字符,或者如果i超过字符串的长度返回0。

const QString string( "abcdefgh" ); QChar ch = string.at( 4 ); // ch == 'e'

判断是否含有某个字符串

#include<QString> 
QString strl="iloveyou"; 
str.contains("you",Qt::CaseSensitive); //成功返回true 第二个参数表示是否大小写敏感

与QDateTime互转

QDateTime转为QString

QString strBuffer;  
QDateTime time;  
time = QDateTime::currentDateTime();  
strBuffer = time.toString("yyyy-MM-dd hh:mm:ss");  
// strBuffer = 2018-06-06 14:05:00  

QString转为QDateTime

QString strBuffer;  
QDateTime time;  strBuffer = "2018-06-06 14:05:00";  
time = QDateTime::fromString(strBuffer, "yyyy-MM-dd hh:mm:ss");  

QVariant

参考https://blog.csdn.net/xiaopei_yan/article/details/81410092

QVariant是一个很神奇、很方便的类。很多时候需要传递几种不同类型的数据,如果用结构体又不太方便,容器保存的也只是一种数据类型,QVariant则可以搞定。

QVariant充当着最常见的数据类型的联合,QVariant可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize、QString,并且还与C++的基本类型,如int、float等。

QVariant支持自定义数据类型。被QVariant储存的数据类型,需要有一个默认的构造函数和一个拷贝的构造函数。

为了实现这个功能,通常要先调用**Q_DECLARE_METATYPE()**这个宏,将其放在类的声明所在的头文件下面:

Q_DECLARE_METATYPE(MyClass)

QVariant的思路和集装箱一致,屏蔽了不同类型的数据结构之间的差异性,让数据以一种标准的形式在类之间、函数之间、对象之间传递,就像集装箱在不同的国家之间运输一样。

对于支持的类型

可直接赋值,但是取值时,对存入的是什么类型,取出也要为这个类型。

如存入为int类型,输出为toString()。

QVariant var;var.setValue(12);int data=var.toInt();

QVariant var=12;int data=var.toInt();

对于不支持的类型

如自定义的结构体。由于Qt都是基于元对象系统,故在头文件里要注册此类属于元类型。

储存用到了QVariant QVariant::fromValue(const T &value)void QVariant::setValue(const T &value)

获取用到了T QVariant::value() const

在此之前一般要用bool QVariant::canConvert(int targetTypeId) const判断是否可以转换。

.h文件声明

struct MyClass{    
int id;    
QString name;
};
Q_DECLARE_METATYPE(MyClass)

.cpp文件

//存储数据    
MyClass myClass;    
myClass.id=0;    
myClass.name=QString("LiMing");     
data[0]=QString("ddd");    
data[1]=123;    
data[3]=QVariant::fromValue(myClass);  //获取数据    
QString str=data.value(0).toString();    
int val=data.value(1).toInt();     
if(data[3].canConvert<MyClass>())    
{        
	MyClass myClass=data[3].value<MyClass>();        
	int id=myClass.id;        
	QString name=myClass.name;    
}

保存指针

//保存
QVariant var=QVariant::fromValue((void*)event);
//获取
QPaintEvent* e=(QPaintEvent*)var.value<void*>();

时间类

QDateTime

将当前时间转换为QString类型

QDateTime dateTime;
QString strDateTime = dateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

从字符串转换为毫秒(需完整的年月日时分秒)

datetime.fromString("2018-07-18 12:10:10:111", "yyyy-MM-dd- hh:mm:ss.zzz").toMSecsSinceEpoch();

从字符串转换为秒(需完整的年月日时分秒)

datetime.fromString("2018-07-18 12:10:10:111", "yyyy-MM-dd hh:mm:ss.zzz").toTime_t();

从毫秒转换到年月日时分秒

datetime.fromMSecsSinceEpoch(1315193829218).toString("yyyy-MM-dd hh:mm:ss.zzz");

从秒转换到年月日时分秒(若有zzz,则为000)

datetime.fromTime_t(1315193829).toString("yyyy-MM-dd hh:mm:ss[:zzz]");

求两个时间毫秒差

QTime startTime = QTime::currentTime();
QTime stopTime  = QTime::currentTime();
qint64 temp = startTime.msecsTo(stopTime);

获取毫秒级的时间戳

QDateTime dateTime = QDateTime::currentDateTime();
// 字符串格式化
QString timestamp = dateTime.toString(“yyyy-MM-dd hh:mm:ss.zzz”);
// 获取毫秒值
int ms = dateTime.time().msec();
// 转换成时间戳
qint64 epochTime = dateTime.toMSecsSinceEpoch();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt-常用数据类型 的相关文章

  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • 如何让小部件在上下文菜单出现时接收鼠标释放事件

    在Ubuntu20 04上 当上下文菜单出现时 我无法让小部件接收鼠标释放事件 而Windows可以接收 我的pyqt版本是5 15 2 我考虑过手动发送鼠标释放事件 但我不知道当上下文菜单出现时哪些系统会收到鼠标释放事件 这样做可能会导致
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 如何在针对 Windows XP 的情况下使用 VS2012 构建 Qt 4/5?

    我正在尝试使用 Visual Studio 2012 构建 Qt 4 8 5 Qt 5 2 1 针对 Windows XP SDK v7 1a 使用 VS2102 编译时 源代码与 SDK v7 1a 存在各种不兼容性 因此无法开箱即用 这
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 在 Qt 中,许多插槽连接到同一信号,它们在发出信号时是否按顺序调用?

    In the Qt文件说 如果多个插槽连接到一个信号 则这些插槽将 按照它们连接的顺序一个接一个地执行 当信号发出时 但在connect 功能 设置Qt ConnectionType输入为Qt QueuedConnection意思是 当控制
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • Qt - 如何使用 QNetworkAccessmanager 获取响应文本

    这是我的代码 Widget Widget manager new QNetworkAccessManager this connect manager SIGNAL finished QNetworkReply this SLOT repl
  • 使用 QWT 构建时出错

    我收到一个错误 undefined reference to QwtPlot QwtPlot QWidget 当我尝试构建我的项目时 即使设置中一切看起来都很好 在我的 CmakeLists txt 中我有 include director
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做

随机推荐

  • STM32 USB学习笔记9

    主机环境 Windows 7 SP1 开发环境 MDK5 14 目标板 STM32F103C8T6 开发库 STM32F1Cube库和STM32 USB Device Library 现在我们来分析VCP例程的最后一个文件USB设备类的us
  • LDAP概念和原理

    http blog sina com cn s blog 6151984a0100ey3z html 什么是目录服务 目录服务就是按照 树状存储信息的模式 目录服务的特点 目录服务与关系型数据库不同 目录服务的数据类型主要是字符型 而不是关
  • 如何通过redis 配置提高redis的性能

    redis的性能 我拿什么拯救 持久化选项 客户端输出缓冲限制 数据结构优化 压缩列表 网络配置 连接池 客户端输出缓冲限制 数据结构优化 压缩列表 网络配置 连接池 不冷战 不任性 多沟通 用舒服的方式喜欢和爱 知道承担 懂得分享 一起进
  • 组件扫描功能

    Spring提供了注解扫描 利用组件扫描注解和组件注解配合 可以自动扫描包空间自动创建Bean对象 减少编码 提高效率 配置文件 Configuration ComponentScan basePackages cn tedu Demo p
  • 数据结构——深度优先遍历(DFS)无向连通图

    以下是数据结构中关于深度优先遍历无向连通图的操作 编程风格参考严蔚敏版数据结构 其实深度优先遍历就是二叉树的先序遍历的推广 头文件以及宏定义 include
  • GitHub博客地址

    本人博客主要发布在GitHub Pages CSDN上的博客不再更新 我的GitHub博客地址 Hong s Bloghttps yalandhong github io 备用链接 https yalandhong vercel app h
  • IDEA解决运行项目虚拟内存溢出问题

    在我们运行一个比较大的项目的时候总是出现Caused by java lang OutOfMemoryError PermGen space的问题简单在网上查询了一下意思是内存溢出了 什么 我的电脑是8G运行内存 256的固态 你告诉这样都
  • bigquant量化平台笔记

    https bigquant com tutorial 宽客学院 https bigquant com community t topic 131694 AI量化策略快速理解 AI量化策略的目标 Label 默认使用股票收益率作为目标 第一
  • 关于antd的treeselect使用

    在表单中 我们可能会碰到这样的需求 比如我想将某一个物品或者资产 分配到某一个部门的员工下 那么我们需要在表单中做这样的配置 这样就会用到antd的treeselect组件 组件很好用 自带搜索框 可以大大的提高用户的可操作性 我们来看一下
  • 【CentOS安装配置Jupyter 】

    CentOS安装配置Jupyter 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 SmartyPants 创建一个自
  • 攻防世界之misc1

    攻防世界之misc1 首先这题非常的考研脚本实力 他题目没有下载文件 只有一个值 d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b
  • Nginx Upstream负责均衡的实现方案

    nginx中upstream实现负责均衡的几种方式 1 轮询 weight 1 默认选项 当weight不指定时 各服务器weight相同 每个请求按时间顺序逐一分配到不同的后端服务器 如果后端服务器down掉 能自动剔除 upstream
  • commons math用户手册翻译(一)

    翻译源址 http commons apache org proper commons math userguide index html 1 math包版本3 6 2 commons math包解决哪些问题 math包由一组数据和统计的包
  • jmavsim使用说明

    一 启动 在px4源码目录下输入 make px4 sitl jmavsim 二 基础操作 在操作界面上按F1键 会弹出操作说明 操作说明如下 按照说明可以控制飞机移动 视角控制 F 第一人称视角 S 地面固定视角 G 稳定云台视角 Z 切
  • jsp 页面选项卡

  • 使用阿里巴巴的EasyExcel操作Excel

    引入依赖
  • 使用TortoiseGit执行merge/rebase操作

    如果使用git 相信大家比较多的使用merge 对于rebase则少有陌生 相信刚使用git不久的同学会有一个困惑 经常使用merge会造成破窗效应 查阅log时会掺杂了大量无用的小提交 起初也对此习以为常 毕竟svn就是这样 使用reba
  • js中background-position 无效

    css中正确书写background position x y 坐标之间有空格 然而在写js的时候如果粗心会忘记第一个 px 后面加个空格 正确js书写应该是backgroundposi x px y px
  • Docker基本概念、linux

    Docker的基本概念 一 认识容器 1 1 容器是什么 1 2 对比容器和虚拟机 1 2 1 虚拟化的差异 1 2 2 资源利用总结 二 Docker基本概念 2 1 Docker是什么 2 2 Docker 的思想与核心 2 3 Doc
  • Qt-常用数据类型

    常用基本数据类型 类型名称 注释 备注 qint8 signed char 有符号8位数据类型 qint16 signed short 有符号16位数据类型 qint32 signed int 有符号32位数据类型 qint64 long