QT的数据类型其实也是C++的数据类型,两者用法基本一致,因此对照C++的基本数据类型介绍QT的基本类型比较
C++ | vector | list | hash_map |
---|---|---|---|
QT | QVector | QList | QHash |
1、头文件
#include
2、使用格式
QVector<类型> 对象;
QVector a;
QVector 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::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::append和QList::prepend在列表的两端进行添加项目。
QList::append是在List数组尾添加内容
QList::prepend是在数组头面添加元素
QList::insert()在列表的中间插入项目。
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList 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
QHash
1 、添加头文件:
#include
2、添加:
QHash map;
map.insert("3name", "leo");
map.insert("1age", "18");
map.insert("2like", "eat");
map.insert("4sex", "man");
3、遍历:
QHash::iterator i;
for( i=map.begin(); i!=map.end(); ++i)
qDebug() << i.key() <<" " << i.value();
//生成一张哈希表,遍历时候怎么添加就怎么展示
qDebug() << "---------------------------------";
QHash::iterator mi;
4、查找:
mi = map.find("2like");
if(mi != map.end())
{
qDebug() << mi.key() <<"--" << mi.value();
}
QAbstractListModel 为列表模型提供了标准接口,列表模型将其数据表示为简单的非分层项目序列。以自己的语言说,QAbstractListModel就类似Excel表类其中的一项,add接口就类似向Excel插入一条数据,其中XXXRole就类似Excel表中的项。
由于该模型提供了比 QAbstractItemModel 更特例化的接口,因此不适合与树视图一起使用。如果想与树视图一块使用提供模型,则需要将QAbstractItemModel 子类化。
如果需要使用多个列表模型来管理数据,那么将 QAbstractTableModel 子类化更合适。
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
#ifndef MYMODEL_H
#define MYMODEL_H
#include
#include
#include
#include
#include
#include
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 roleNames() const;
//自定义 设置当前model第index行的当前组件指针
Q_INVOKABLE void setcuritem(int index , QVariant j)
{
//qDebug()< m_datas;
};
#endif