当创建一个QObject时,如果使用了其他的对象,作为父对象(parent),那么这个Object就会被添加到父对象children()列表中。
对象树与拥有权:
QWidget作为QWidgets模块的基础类:扩展了动态间的父子关系。
元对象系统:
Qt中的元对象系统(Meta-Object Stystem)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。
(1)该类必须继承自QObject
(2)必须在类的私有声明Q_OBJECT宏(在类定义时,如果没有指定public或者private,则默认为private)
(3)元对象编译器Meta-Object Compiler(moc)为QObject的子类提供必要的代码。
QT容器类:
顺序容器:QList、QLinkedList,QVector、QStack和Qqueue:因为这些容器中的数据都是一个接一个线性存储的,所以称之为顺序容器。
对于大多数应用程序而言,使用最多的是QList,尽管是数组列表,但是可以快速对头部进行添加和删除的操作。
【QLinkedList】如果需要使用一个链表,那么可以使用QLinkedList。
【QVector】如果数据项可以占据连续的内存空间:可以使用QVector。
【QStack】提供了后进先出(LIFO)
【QQueue】提供了先进先出(FIFO)
QMap、QMultiMap、QHash、QMultiHash和QSet
因为这些容器存储的是<键,值>对,比如QMap
#include "mainwindow.h"
#include <QApplication>
#include <QCoreApplication>
#include <QList>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QList<QString>list;
list<<"aa"<<"bb"<<"c"; //插入项目
if(list[1] == "bb") list[1] = "ab";
list.replace(2,"bc");
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i){
qDebug()<<list.at(i);
}
//现在的输出是aa,ab,bc
list.append("dd");
list.prepend("dd");
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i){
qDebug()<<list.at(i);
}
//计划的输出是:dd aa ab bc dd
//实际的输出是:dd aa ab bc dd
QString str = list.takeAt(2);//从列表中删除第3个项目,并获取它
qDebug()<<"at(2) item is:"<<str;
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i){
qDebug()<<list.at(i);
}
//计划输出:ab 后面是 dd aa bc dd
//实际输出:ab 后面是 dd aa bc dd
list.insert(2,"mm"); //在位置2插入项目
//list.swap(1,3); //交换项目1和项目3
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i){
qDebug()<<list.at(i);
}
//实际输出dd aa mm bc dd
list.swap(1,3);
qDebug()<<"the list is:";
for(int i=0;i<list.size();++i){
qDebug()<<list.at(i);
}
qDebug()<<"contain 'mm'?"<<list.contains("mm");//列表中是否包含"mm"
qDebug()<<"the 'mm' count:"<<list.count("mm");//包含“mm”的个数
//第一个mm的位置,默认从位置0开始往前找查找,返回第一个匹配的项目位置
qDebug()<<"the first 'mm' index:"<<list.indexOf("mm");
//第二个“mm”的位置,我们制定从制定的位置1查找
qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",1);
return a.exec();
}
QList是一个模板类,提供了一个列表。QList是一个T类型的指针数组,所以支持基于索引的访问,而且当项目小于1000时,可以进行快速的插入操作。
插入操作:insert()
替换操作:replace()
移除操作:removeAt()
移动操作:move()
交换操作:swap()
在表尾添加项目:append()
在表头添加项目:prepend()
移除第一个项目:removeFirst()
移除最后一个项目:removeLast()
从列表中移除一项,并获取这个项目takeAt()
响应的takeFirst()和takeLast()
获取项目的索引:indexOf()
判断是否含有相应的项目contains()
获取一个项目出现的次数counts()