QT的常用的数据类型

2023-11-04

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::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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT的常用的数据类型 的相关文章

随机推荐

  • npm link实操详细指南

    准备 首先我们需要有两个npm包 一个作为依赖包 一个作为应用包 依赖包 deps 应用包 app 然后仔仔细细的看一下依赖包的包名和输出路径 如main 好几次用法不对都是因为main字段配置的路径有问题 如我的依赖包package js
  • 多线程(Threading)和多进程(Multiprocessing)

    多线程和多进程 线程和进程是什么 进程间通信方式 线程间通信方式 死锁 Python多线程 Threading 什么是多线程 基本方法函数 join Queue 继承使用线程 同步 GIL锁 锁 Python多进程 多核 Multiproc
  • java.lang.ClassCastException的java类型转换异常解决方案

    在项目中 需要使用XStream将xml string转成相应的对象 却报出了java lang ClassCastException com model test cannot be cast to com model test的错误 原
  • 钟汉良日记:什么副业最好?可以持续带来复利效应的技能,写作!

    2022年9月3日 周六 大晴天 看到一些人做抖音 做自媒体发财了 你是不是也挺羡慕的 可是真要你也去拍摄短视频 做直播真人出镜 大多数人又做不到 怎么办 我觉得 大家还是要认识到一点 打铁还需自身硬 你如果没有足够的对应的能力 只能做一个
  • 【从零开始的Java开发】2-10-2 Servlet入门:Servlet开发步骤、请求参数的发送与接收、Get和Post、注解

    文章目录 概述 软件结构发展史 Tomcat与Servlet Servlet 第一个Servlet JavaWeb工程结构 Servlet开发步骤 请求参数的发送与接收 Get和Post请求方法 Servlet生命周期 使用注解简化配置 启
  • 在Unity中双击打不开vs脚本文件

    从官网下载软件后 创建新项目后 容易漏掉这个设置 导致双击脚本打不开 解决方法 点击找到Edit gt Preferences gt External Tool gt External Script Editor 将对应设置改成你所下载的v
  • 11. TypeScript 条件类型

    TypeScript 条件类型 1 条件类型基本使用 可以使用extends关键字和三元表达式 实现条件判断 interface Fish name1 string interface Water name2 string interfac
  • River Jumping【贪心+模拟】

    题目链接 我们可以贪心的从前往后 每次选最接近的且满足条件的这样的贪心 然后从后往前的时候 就是直接用倒着一个个判断是否合法即可 include
  • 2023百度云智大会:科技与创新的交汇点

    这次的百度云智大会 可谓是亮点云集 发布了包含42个大模型 41个数据集 10个精选应用范式的全新升级千帆大模型平台2 0 发布首个大模型生态伙伴计划 而且也预告了文心大模型4 0的发布 大模型服务的成绩单也非常秀 月活企业数已近万家 覆盖
  • 【已解决】Docker启动失败,报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

    报错原因 无法与Docker守护进程建立连接 守护进程负责管理Docker容器和镜像 并提供对Docker API的访问 解决措施 输入以下代码 重启docker服务 service docker start 验证成功 1 输入以下代码 则
  • 如何避免爬虫IP被屏蔽

    各位爬友们好 作为一名专业的爬虫代理提供者 我要和大家分享一些避免爬虫IP被屏蔽的实用技巧 你知道吗 当我们爬取数据的时候 很容易被目标网站识别出来并封禁我们的IP地址 导致无法继续爬取数据 这个问题困扰了很多爬虫程序员 但别担心 今天我就
  • jetbrains IDE设置 phpstorm

    PhpStorm插件 进入 File gt Settings gt Plugins gt Browse repositories 搜索你想要的插件 PHP插件 Symfony Plugin 支持 Symfony 2 3 4 Laravel
  • vue+element-ui el-table组件二次封装实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题

    一 此功能已集成到TTable组件中 二 最终效果 三 需求 某些页面不做分页时 当数据过多 会导致页面卡顿 甚至卡死 四 虚拟滚动 一 固定一个可视区域的大小并且其大小是不变的 那么要做到性能最大化就需要尽量少地渲染 DOM 元素 而这个
  • stm32电机控制之控制两路直流电机!看完你会了吗

    小车使用的电机是12v供电的直流电机 带编码器反馈 这样就可以采用闭环速度控制 这里电机使用PWM驱动 速度控制框图如下 由以上框图可知 STM32通过定时器模块输出PWM波来控制两个直流电机的转动 通过改变PWM占空比的大小可以改变电机的
  • 【分享】科大讯飞星火认知大模型(初体验)

    前言 哈喽 大家好 我是木易巷 随着人工智能技术的迅猛发展 自然语言处理 NLP 成为了热门话题 在众多NLP模型中 科大讯飞星火认知大模型成为了一个备受瞩目的新秀 今天我们来了解一下这个由科大讯飞公司开发的人工智能模型 内测方法在文末 5
  • 智齿科技:更坚定地迈出“全面国际化”战略步伐

    2月28日 智齿科技召开了以 领航出海 联络世界 为主题的媒体沟通会 近二十家出海媒体 ToB行业媒体代表参与了此次会议 会上 智齿科技联合创始人 CEO徐懿公布了国际化战略实施情况 自2021年底开展国际化战略至今 智齿科技已初步构建了国
  • java异常处理

    1 概念 在我们的程序运行时经常会出现一些操作会使我们的程序无法继续运行下去 用户的非正常输入或者程序本身逻辑上的错误等 这些都会导致我们程序无法继续进行下去 但我们想要这个程序继续执行 就需要进行处理 1 1 在java中 运行时的错误会
  • Qt-QLabel的创建使用和修改属性

    一 QLabel的 创建 方法1 QLabel lable1 new QLabel 默认位置 0 0 lable1 gt setText 这是一个QLabel1 设置文本 lable1 gt setParent this 设置parent
  • 3.基于Arduino的循迹小车

    前言 长期以来一直把arduino看为一款比较弱智简单的单片机 好像事实也是如此 小学生基本不会去学51单片机 但是却在学习arduino单片机 因为相当于傻瓜编程 网上程序一扎一大堆 甚至小学生比有的大学生玩的还溜 arduino使用的是
  • QT的常用的数据类型

    QT的基本数据类型 QT的数据类型其实也是C 的数据类型 两者用法基本一致 因此对照C 的基本数据类型介绍QT的基本类型比较 C vector list hash map QT QVector QList QHash 一 QVector 1