QT中的常用数据结构及函数

QT中的常用数据结构及函数,第1张

1、QString
2、QVariant
3、QStringList
4、QVector
5、QStack
6、QQueue
7、QList
8、QMap

QString 是qt中关于String的封装类,用于处理字符串
'''

void testQString(){
QString str1="hello";
qDebug()<<str1;
str1append("word");
qDebug()<<str1;//"hello word"
qDebug()<<str1indexOf("word");//5
QString str2="Hello";
qDebug()<<str2;
str2fill('x');//"xxxxx"
qDebug()<<str2;
str2fill('x',2);//"xx"
qDebug()<<str2;
qDebug()<<QString()isEmpty();//true
qDebug()<<QString("")isEmpty();//true
qDebug()<<QString(" ")isEmpty();//false
qDebug()<<QString("abc")isEmpty();//false
qDebug()<<QString()isNull();//true
qDebug()<<QString("")isNull();//false
qDebug()<<QString(" adc")isNull();//false
QString str3="Hello";
qDebug()<<str3;
qDebug()<<str3left(3);//"hel"
qDebug()<<str3mid(2,2);//"ll"
qDebug()<<str3mid(2);//"llo"
qDebug()<<str3right(4);//"ello"
QString str4="hello word";
qDebug()<<str4;//"hello word"
str4remove(5,6);
qDebug()<<str4;//"hello"
QString str5="hello word";
str5insert(5,QString("word"));
qDebug()<<str5;//"hello wordword"
QString str6="hello word";
QString re="you";
str6replace("word",re);
qDebug()<<str6;//"hello you"
QString path="/user/local/bin/mapp";
qDebug()<<path;//"/user/local/bin/mapp"
QStringList list=pathsplit('/',QString::SkipEmptyParts);
qDebug()<<list;//("user,"local","bin","mapp")
QString str7="hello word";
qDebug()<<str7startsWith("hello");//true
qDebug()<<str7endsWith("word");//true
qDebug()<<QString("hello %1,helo you %2 ")arg("word")arg("hmf");//hello word,hello you hmf
qDebug()<<QString::localeAwareCompare("xxx","XXX");//-1
}
'''

QVariant 是万能变量,可以存取各种变量。
'''

void testQVariant(){
QVariant var;
varsetValue(QString("hello word"));
qDebug()<<var;//QVariant(QString, "hello word")
QString data=vartoString();
qDebug()<<data;//"hello word"
// varclear();
varsetValue(100);
qDebug()<<var;//QVariant(int, 100)
int d=vartoInt();
qDebug()<<d;//100

}
'''

QStringList 是存储QString类型的列表。
'''

void testQStringList(){
QStringList stL;
stL<<"str1"<<"str2"<<"str3"<<"str4";
qDebug()<<stL;//("str1", "str2", "str3", "str4")

QString str1=stLjoin("/");
qDebug()<<str1;//"str1/str2/str3/str4"

qDebug()<<stLcontains("str1");//true

qDebug()<<stLindexOf("str2");//1

stLappend("str3");
stLappend("str4");
qDebug()<<stL;//("str1", "str2", "str3", "str4", "str3", "str4")

stLremoveDuplicates();
qDebug()<<stL;//("str1", "str2", "str3", "str4")

//遍历方法1
for (int i=0;i<stLsize();i++){
qDebug()<<stLat(i);
}
//遍历方法2
QStringList::Iterator itr;
for(itr=stLbegin();itr!=stLend();++itr){
qDebug()<<itr;
}
}
'''

QVector 数组的模板类,本质是动态数组,存储方式是一片连续的内存空间。
'''

void testQVector(){
QVector<QString> tV;
tVappend("Str1");
tVappend("str2");
tVappend("str3");
tVappend("str4");
qDebug()<<tV;//QVector("Str1", "str2", "str3", "str4")

tVprepend("str0");
qDebug()<<tV;//QVector("str0", "Str1", "str2", "str3", "str4")

tVpush_back("str5");
qDebug()<<tV;//QVector("str0", "Str1", "str2", "str3", "str4", "str5")

tVpush_front("str00");
qDebug()<<tV;//QVector("str00", "str0", "Str1", "str2", "str3", "str4", "str5")

for(int i=0;i<tVsize();i++){
qDebug()<<tVat(i);
}

QVector<QString>::Iterator itr;

for(itr=tVbegin();itr!=tVend();itr++){
qDebug()<<itr;
}

qDebug()<<tVisEmpty();//false

qDebug()<<tVat(0);//"str00"

qDebug()<<tVvalue(3);//"str2"

qDebug()<<tVsize();//7

tVpop_back();
qDebug()<<tV;//QVector("str00", "str0", "Str1", "str2", "str3", "str4")

tVpop_front();
qDebug()<<tV;//QVector("str0", "Str1", "str2", "str3", "str4")
}
'''

QStack为qt中的栈模板类,继承于QVector,具有后进先出的特性。
'''

void testQStack(){
QStack<QString> stack;
stackpush("str1");
stackpush("str2");
stackpush("str3");
stackpush("str4");
qDebug()<<stack;//QVector("str1", "str2", "str3", "str4")

qDebug()<<stackpop();//"str4"
qDebug()<<stack;//QVector("str1", "str2", "str3")

qDebug()<<stacktop();//"str3"
qDebug()<<stack;//QVector("str1", "str2", "str3")

qDebug()<<stackisEmpty();//false

qDebug()<<stacksize();//3

while(!stackisEmpty())
{
qDebug()<<stackpop();
}
}
'''

QQueue 是qt中的队列的模板类,同样继承自QVector,具有先进先出的特性。
'''

void testQueue()
{
QQueue<QString> qq;
qqenqueue("str1");
qqenqueue("str2");
qqenqueue("str3");
qqenqueue("str4");

}
'''

QList是qt中的链表的实现,同时可以按位置索引和快速插入删除数据。
'''

void testList(){
QList<QString> ql;
qlappend("str");
qlappend("str1");
qlappend("str2");
qlappend("str3");
qlappend("str4");
qlappend("str5");
qDebug()<<ql;//("str", "str1", "str2", "str3", "str4", "str5")

for(int i=0;i<qlsize();i++){
qDebug()<<qlat(i);
}
QList<QString>::Iterator itr;
for(itr=qlbegin();itr!=qlend();itr++){
qDebug()<<itr;
}
qlpop_back();
qDebug()<<ql;//("str", "str1", "str2", "str3", "str4")

qlpop_front();
qDebug()<<ql;//("str1", "str2", "str3", "str4")

qDebug()<<qlsize();//4

qDebug()<<qlisEmpty();//false
}
'''

QMap 是qt中映射的模板类。就是字典。
'''

void testMap()
{
QMap<QString,int> map;
map["one"]=1;
mapinsert("two",2);
map["three"]=3;
map["four"]=4;
map["five"]=5;
qDebug()<<map;//QMap(("five", 5)("four", 4)("one", 1)("three", 3)("two", 2))

qDebug()<<mapvalue("one");//1
qDebug()<<map["two"];//2

qDebug()<<mapcontains("two");//true

qDebug()<<mapkeys();//("five", "four", "one", "three", "two")

qDebug()<<mapvalues();//(5, 4, 1, 3, 2)
//数据遍历
QMapIterator<QString ,int> itr(map);
while(itrhasNext()){
itrnext();
qDebug()<<itrkey()<<itrvalue();
}
}
'''

Sender

Sloter

Connection

那么Qt是怎么将这两个信号槽链接起来的呢?接下来看一看connect的源码:
在Qt中connect有很多个重载,大致可以分为2类:一种是qt4的Sender(),Slot()方式,另一种是qt5的模板方式进行链接

用这种方式链接会调用上图中的第一个connect函数,其内部的实现如下(太多了我们分段看看)

这一部分主要是在检测传入的信号是否属于sender,不是的话会告警并直接返回,这也是这种方式不好的地方,必须写正确,而且写错了如果不看告警的话是不知道的。
这里面两个主要的函数:

我们看看他们是如何实现的

通过Qt的元对象(QMetaObject)获取,到这里需要讲一讲QMetaObject是个什么东西,它是个类,内部有一个结构体d如下:

OK,继续回去看staticMetaObject这个成员的初始化,我们在这里先只关注stringdata和data这个两个参数,这里用到了,后面会继续有其他参数的意义,在这个地方stringdata被初始化成了qt_meta_stringdata_TestSenderdata,data被初始化成了qt_meta_data_TestSender。它们是啥,还是在moc文件里

这两个一个保存着信号的名字,一个保存着信号的返回值,参数类型和参数个数。
到这里就可以通过这两个参数和链接时传入的signal字符串对比找到信号在sender中的的位置,当然因为继承的存在,所以这个位置不是真是的位置,还需要找到signalOffset这个函数找到在这个类中的位置。怎么找的呢?其实MetaObject中的data最终会被转换成这个

因为QObject有2个信号,所有这个地方获取到的索引位置为3

这一段跟上面差不多,用来检车receiver和槽函数是否对应

这个地方主要是检查信号槽的参数(比如信号的参数不能比槽的参数少等)
接下来就会进入另一个connect函数,他的实现

到这里就要看到信号槽是如何链接起来的了,每个QObject的对象都会维护着多个Connection的链接对象,这里面存储着信号的发送者、信号的接收者等一系列信息

至此信号差就链接起来了,最终会以Connection对象的方式存放在每个QObject对象的connectionlist里面,这种是Qt4老的链接方式

Qt5的新链接方式相比Qt4要简单很多,因为是基于模板实现的,因此可以直接找到函数的地址,最终也会放到链接列表里,来看看与Qt4的区别吧。
不知道是否还记得最开始connect函数的几种重载,这里用到的是下面红框里的方式(模板)
让我们先看一种

它会调用这个实例化的模板函数

看到了吧,这个函数有2个功能,一个是执行信号(因为信号可能会很信号链接,具体怎么执行到的后面会讲),另一个是获取信号函数在对象的偏移量(如何获取的呢,其实就是对比传入的信号函数的地址和实际信号的地址,这里a0就是要获取的偏移量,a1就是信号函数的地址)

这个地方需要注意的是connecImpl与connect不同的是吧receiver对象包装成了一个QSlotObject的对象,它是这样的

这个类接受一个QtPrivate::FunctionPointer<Func>的对象,这个是个啥?着其实是个模板类,用来识别槽函数的地址,在connect的时候也用到了这个,具体怎么实现的可以放出来,就是模板的推导比较麻烦,可以简单的理解成通过这个可以判断槽函数是否是receiver的成员函数

接着往下讲,不知道是否还记得之前的connectImpl函数,它获取到了信号的偏移量,接着又调用了一个connectImpl,它是这样的

看到这里有没有熟悉的感觉,跟Qt4的其实差不多,也是将信号槽存储到connection对象内,在添加到sender的connectionList里,不过这里存储的槽不是一个函数,而是一个QSlotObject对象的地址,看看Connection结构的内容可以发现使用Union实现的,存储的都是一个地址
到这里就讲完了Qt4和Qt5信号槽的链接部分,不知道是否讲的明白,moc文件里生成的东西基本就是Qt信号槽的核心,每一个都有其作用,都对应着QObjcet底层的数据,也是Qt元对象的核心。

C++中两个字符串的大小比较方法如下:

1、首先,定义一个整型变量j,保存判断的结果。

2、接着,定义两个字符串变量,保存判断的字符串。

3、输入两个字符串,保存在变量s1和s2中。

4、比较字符串s1和s2的大小,保存在变量j中。

5、根据判断结果j的值,输出两个字符串的比较结果。

6、用compare函数比较两个字符串,当s1大于s2时返回值大于0,当s1等于s2时返回值等于0,当s1小于s2时返回值小于0。

一、QSting删除空白符

1、使用正则表达

str= strremove( QRegExp("\\s") )//删除字符床中的所有空白符

2、使用simplified()方法

str = strsimplified()//删除字符串前后的所有空白符,中间的所有空白符使用单个空格替换

3、使用trimmed()方法

str = strtrimmed()//删除字符串前后的所有空白符

一、转换为标准库中的string格式
1、在进行Qt编程时,由于标准库中的cout函数是无法识别QString字符串的,因此如果想使用cout输出QString字符串,就需要将其转换为std::string。
2、要想将QString转换为std::string格式,只需要调用QString的成员函数toStdString( ) 即可。
3、下面是以上代码的输出结果。可以看到,使用cout完美输出了QString字符串。
二、转换到数值格式
1、转换到int
如果想将QString转换为int,可使用QString的成员函数toInt,并传递两个参数。参数一为bool类型的指针,返回转换结果;参数二为int类型,表示进制。注意,由于这两个参数都有默认值,如果是10进制数字,也可以不用传递参数直接调用。
例如,在上面的例子中将字符串“123”转换为10进制的int值123。
2、转换到float
同样,也可将QString转换为相应的浮点数。例如,如果想转换为float类型,则可调用toFloat成员函数。
3、转换到double
如果想转换为double类型,则可调用toDouble成员函数。

QString x = "asdasd\tdsdasd";
int a=xindexOf("\t"); //return 6
QString y = xleft(a);
首先是获得到\t的位置,然后获得指定位置的字符串

1、c++中可以用strcmp()函数的判断两个字符串是否相等。具体的方法,首先打开一个空白的c++文件:

2、在C++文件里编写判断字符串的示例程序,这里在程序中输入两个字符串,之后程序会使用strcmp()函数判断是否为相同的字符串,最后程序会输出判断的结果:

3、最后用编辑器运行程序,在d出的窗口中,输入两个字符串,程序最终就会打印出判断的结果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13391222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存