QT的常用的数据类型

QT的基本数据类型

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

C++vectorlisthash_map
QTQVectorQListQHash

一、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::appendQList::prepend在列表的两端进行添加项目。

  • QList::append是在List数组尾添加内容

  • QList::prepend是在数组头面添加元素

  • QList::insert()在列表的中间插入项目。

#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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值