QT的常用的数据类型

QT的基本数据类型

QT的数据类型其实也是C++的数据类型,两者用法基本一致,因此对照C++的基本数据类型介绍QT的基本类型比较

C++ vector list hash_map
QT QVector QList QHash

一、QVector

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使用数组来实现,以确保进行快速的基于索引的访问。
使用QList::appendQList::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

QHash是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap相同,但是与QMap相比,它对K的模板类型有不同的要求,而且它提供了比QMap更快的查找功能。

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

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 
#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

你可能感兴趣的:(QML专栏,qt,qml,数据类型)