一、信号和槽
1.一个信号可以与另一个信号相连,如:
connect(object1, SIGNAL(object1Signal1(int, int,char)),
object1, SIGNAL(object1Signal2(int, int,char)));//同一个对象里的不同信号
connect(object1, SIGNAL(object1Signal1(int, int,char)),
object2, SIGNAL(object1Signal3(int, int,char)));//不同对象里的不同信号
2.同一个信号可以与多个槽相连
connect(object1, SIGNAL(object1Signal1(int, int,char)),
object1, SLOT(object1Slot(int, int,char)));//同一对象里的槽函数
connect(object1, SIGNAL(object1Signal1(int, int,char)),
object2, SLOT(object2Slot(int, int,char)));//不同对象里的槽函数
3.同一个槽可以与多个信号相连
connect(object1, SIGNAL(object1Signal1(int, int,char)),
object1, SLOT(object1Slot(int, int,char)));//同一对象里的信号
connect(object2, SIGNAL(object2Signal1(int, int,char)),
object1, SLOT(object1Slot(int, int,char)));//不同对象里的信号
4.信号的参数个数一定多于或者等于槽函数的参数个数,槽函数的所有参数类型必须与信号的参数类型对应
connect(object1, SIGNAL(object1Signal1(int, int,char)),
object1, SLOT(object1Slot(int, int,char,int)));
//槽函数object1Slot的前三个参数类型和信号object1Signal1相同
5.对于自定义的类型、结构体等想要作为信号传递给槽函数,必须用qRegisterMetaType()函数注册类型
struct user_info {
QString name;
int age;
};
qRegisterMetaType<struct user_info >("user_info ");
//对于自定义结构体要先注册才能在信号和槽中被当成参数正确传递
connect(object1, SIGNAL(object1Signal(struct user_info)),
this, SLOT(object2Slot(struct user_info)));
二、字符串操作
QString string1 = "hello";
QString string2 = "world";
//常用字符串拼接四种方法
QString string = string1 +" " + string2;
qDebug()<<"+:"<<string;
string1.append(" ");
string1.append(string2);
qDebug()<<"append:"<<string1;
string1 = "hello ";
string2 = "world";
string.sprintf("%s %s",string1.toLatin1().data(), string2.toLatin1().data());
qDebug()<<"sprintf:"<<string;
string = QString("%1 this is %2").arg(string1).arg(string2);
qDebug()<<"arg:"<<string;
//常用字符串分割
string1 = "one,tow,three";
string2 = "/usr/local/bin";
//SectionSkipEmpty将空字段视为不存在,即在开始和结束时不考虑它们。
QString::SectionFlag flag = QString::SectionSkipEmpty;//
string = string1.section(',', 1, 1); // str == "tow"
qDebug()<<"1:"<<string;
string = string2.section('/', -2, -2, flag); // str == "local"
qDebug()<<"2:"<<string;
三、容器使用
QList、QLinkList、QVector三种容器类的时间复杂度比较:
1.QList <T>
QList容器提供了追加、插入、删除、替代等方法。对于不同的数据类型:
(1)如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同),QList会将数值直接存储在它的数组中
(2)如果QList <T>存储对象的指针,则该指针指向实际存储的对象
QList<int> list;
int i = 0;
for(i = 0; i < 10; i++) {
list.append(i); //相当于list.insert(size(), i),在列表末尾增加数据
}
qDebug()<<"size ="<<list.size(); //输出列表大小
for(i = 0; i < 10; i++) {
qDebug()<<"i ="<<list.at(i); //输出在i位置的列表的值
}
qDebug()<<"inset/replace/delet";
list.insert(5,100); //插入数据,若非往列表末尾插入数据则不改变列表大小,该位置的元素往后移,最末尾的丢弃
list.replace(6,101); //替换
list.removeAt(9); //删除
for(i = 0; i < 10; i++) {
qDebug()<<"i ="<<list.at(i);
}
list.clear(); //清空列表
qDebug()<<"size ="<<list.size();
if(list.isEmpty()) //判断列表是否为空
qDebug()<<"list is empty";
2.QLinkList<T>
和QList在用法上不同的是,QLinkList<T>是一个链式列表,它以非连续的内存块保存数据。并且QLinkList<T>不能使用下标,只能使用迭代器访问它的数据项。关于QLinkedList的使用请参考:
用QLinkedList写链表(创建、显示、插入、删除)以及出现相关错误
举个简单例子:
int i;
QLinkedList<int> linkedList;
for(i = 0; i < 10; i++) {
linkedList.append(i);
}
qDebug()<<"size ="<<linkedList.size();
QLinkedList<int>::iterator it;
for(it = linkedList.begin(); it != linkedList.end(); it++)
qDebug()<<"it ="<<*it;
3.QVector <T>
对于QVector,QVector <T>在相邻的内存中存储给定数据类型T的一组数值。QVector即可以使用下标访问数据项,也可以使用迭代器访问数据项。当使用下标访问数据项时,用法与QList大同小异,使用迭代器访问数据项时,用法与QLinkedList大同小异。
int i;
QVector <int> vector;
for(i = 0; i < 10; i++) {
vector.append(i);
}
qDebug()<<"size ="<<vector.size();
for(i = 0; i < 10; i++) {
qDebug()<<"i ="<<vector.at(i);
}
qDebug()<<"inset/replace/delet";
vector.insert(5,100);
vector.replace(6,101);
vector.removeAt(9);
vector.push_back(120); //在尾部增加
vector.push_front(110); //在头部添加,QList也有这个方法
for(i = 0; i < 12; i++) {
qDebug()<<"i ="<<vector.at(i);
}
qDebug()<<"pop";
vector.pop_back(); //删除尾部元素
vector.pop_front(); //删除头部元素
for(i = 0; i < 10; i++) {
qDebug()<<"i ="<<vector.at(i);
}
vector.clear();
qDebug()<<"size ="<<vector.size();
if(vector.isEmpty())
qDebug()<<"list is empty";