QT的基本数据类型
QT的数据类型其实也是C++的数据类型,两者用法基本一致,因此对照C++的基本数据类型介绍QT的基本类型比较
C++ |
vector |
list |
hash_map |
QT |
QVector |
QList |
QHash |
一、QVector
1、头文件
#include <QVector>
2、使用格式
QVector<类型> 对象;
QVector<int> a;
QVector<QString> b;
3、向容器中添加内容
a.append(1)
a.append(2)
a.insert(0, 3) //第一个参数代表的是插入数据的位置,第二个代表插入数据
4、循环打印容器内容
// 方式一
for(int i = 0; i < a.size(); i++){
qDebug() << a.at(i);
}
// 方式二
for(auto first = b.begin(); first != b.end(); first++){
qDebug() << *first;
}
// 方式三
QVector<int>::iterator iter;
for (iter=b.begin();iter!=b.end();iter++){
qDebug() << *iter << "\0";
}
5、删除元素
b.remove(1); // 参数代表的是位置
b.pop_back(); // 删除末尾元素
b.pop_front(); // 删除开始位置元素
二、QList
QList是目前最常用的容器类,它存储了给定类型的值的一个列表,而这些值可以通过索引访问。QList使用数组来实现,以确保进行快速的基于索引的访问。
使用QList::append和QList::prepend在列表的两端进行添加项目。
#include <QCoreApplication>
#include <QList>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<QString> list;
list << "aa" << "bb" << "cc"; // 插入项目
if(list[1] == "bb") list[1] = "ab";
list.replace(2, "bc"); // 将“cc”换为“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("mm"); // 在列表头部添加
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); // 现在列表为mm 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); // 现在列表为mm bc mm aa dd
}
qDebug() << "contains '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();
}
三、QHash
QHash<K, T>是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap<K, T>相同,但是与QMap<K, T>相比,它对K的模板类型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。
1 、添加头文件:
#include <QHash>
2、添加:
QHash<QString, QString> map;
map.insert("3name", "leo");
map.insert("1age", "18");
map.insert("2like", "eat");
map.insert("4sex", "man");
3、遍历:
QHash<QString, QString>::iterator i;
for( i=map.begin(); i!=map.end(); ++i)
qDebug() << i.key() <<" " << i.value();
//生成一张哈希表,遍历时候怎么添加就怎么展示
qDebug() << "---------------------------------";
QHash<QString, QString>::iterator mi;
4、查找:
mi = map.find("2like");
if(mi != map.end())
{
qDebug() << mi.key() <<"--" << mi.value();
}
四、QAbstractListModel
1、QAbstractListModel
QAbstractListModel 为列表模型提供了标准接口,列表模型将其数据表示为简单的非分层项目序列。以自己的语言说,QAbstractListModel就类似Excel表类其中的一项,add接口就类似向Excel插入一条数据,其中XXXRole就类似Excel表中的项。
由于该模型提供了比 QAbstractItemModel 更特例化的接口,因此不适合与树视图一起使用。如果想与树视图一块使用提供模型,则需要将QAbstractItemModel 子类化。
如果需要使用多个列表模型来管理数据,那么将 QAbstractTableModel 子类化更合适。
2、子类化
1、在继承 QAbstractListModel 时,必须提供 rowCount() 和 data() 函数的实现。表现良好的模型还提供了 headerData() 实现。
2、如果模型在 QML 中使用并且需要使用自定义角色,则必须覆盖 roleNames() 函数。
3、对于可编辑列表模型,还必须提供 setData() 的实现,并实现 flags() 函数,以便它返回一个包含 Qt::ItemIsEditable 的值。
4、QAbstractListModel 提供了 columnCount() 的默认实现,它通知视图此模型中只有一列项目。
5、为可调整大小的类似列表的数据结构提供接口的模型可以提供 insertRows() 和 removeRows() 的实现。在实现这些功能时,重要的是调用适当的功能,以便所有连接的视图都知道任何更改:
insertRows():必须在将新行插入数据结构之前调用 beginInsertRows(),并且在之后必须立即调用 endInsertRows()
removeRows():必须在从数据结构中删除行之前调用 beginRemoveRows() ,之后必须立即调用 endRemoveRows()。
重写下面三种虚拟函数
virtual int rowCount(const QModelIndex &parent) const override;
virtual QVariant data(const QModelIndex &index, int role) const override;
QVariant RoleEntryModel::data(const QModelIndex &index, int role) const
3、实例代码
#ifndef MYMODEL_H
#define MYMODEL_H
#include <QAbstractListModel>
#include <QHash>
#include <QList>
#include <QByteArray>
#include <QDebug>
#include <vector>
class mydata
{
public:
mydata(const QString& data1, const QString& data2):mdata1(data1),mdata2(data2)
{
}
QString data1() const { return this->mdata1; }
QString data2() const { return this->mdata2; }
QVariant obj;//当前model的组件对象
private:
QString mdata1;
QString mdata2;
};
class MyModel :public QAbstractListModel
{
Q_OBJECT
public:
enum datatype{
type1=1,
type2,
type3
};
MyModel(QObject* parent=NULL);
//外部接口 QML调用 添加数据
Q_INVOKABLE void pushdata(const QString& data1, const QString& data2);
//外部接口 QML调用 添加数据在指定行
Q_INVOKABLE void minsert(int index, const QString& data1, const QString& data2);
//外部接口 删除指定行
Q_INVOKABLE void mremove(int index);
//外部接口 C++调用 添加数据
void Add(mydata& md);
//外部接口 清除model
Q_INVOKABLE void clear();
//虚函数 qml内部调用 获取第index行的内容 role 内容索引
QVariant data(const QModelIndex &index, int role =Qt::DisplayRole) const;
//虚函数 获取model行数
int rowCount(const QModelIndex &parent = QModelIndex() ) const;
// 虚函数 内容的别名 qml 内部调用
QHash<int, QByteArray> roleNames() const;
//自定义 设置当前model第index行的当前组件指针
Q_INVOKABLE void setcuritem(int index , QVariant j)
{
//qDebug()<<j;
m_datas[index].obj = j;
}
~MyModel() {}
private:
//model数据集合
std::vector<mydata> m_datas;
};
#endif