C++列表实现

一、listView

相关内容

QAbstractItemModel:一个抽象的类,为数据项模型提供抽象的接口,常见的的数据模型列如:QStringListModel,QStandardItemMode,QDirModel等都继承于此类;

QStringListModel:数据模型,储存一组字符串;

QList:列表类,以列表形态储存并管理其中的列表元素,并支持基于快速索引的数据存取,也可进行快速的数据删除操作;

QStringList:从QList继承而来,字符串列表类;

QListView:列表示图封装类,用来显示一维(一列)数据列表,二维数据列表可以用QTableView控件;
原文链接

主要思想

先把数据组织好保存到数字模型中,再将数据模型设置到列表视图控件中(树形控件也是如此)。

实例

以字符串列表操作为例:

  • 显示采用ListView控件;

  • 数据模型用QStringListModel;

我们首先要构造一个QStringListModel,这个数据模型最简单的方法就是采用现有的数据模型进行构造,我们进行如下操作;

要用到QStringListModel,需要包含头文件:

#include<QStringListModel>

在.h文件中添加我们需要的两个成员变量:

QStringListModel *model;
QStringList strlist;

在.cpp需要的位置添加:

model= new QStringListModel(this);
model->setStringList(strlist);
ui->listView->setModel(model);

全部代码

QtMainPage.cpp

#include "QtMainPage.h"
#include "ui_QtMainPage.h"

#include<QStringListModel>  //数据模型,储存一组字符串
//调试输出
#include <QDebug>

//防止中文乱码
#pragma execution_character_set("utf-8") 

QtMainPage::QtMainPage(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	//星号*是解引用运算符,用于获取指针指向的值
	//QListView *listView = new QListView(this);

	strlist << "第一行内容";
	strlist << "第二行内容";
	model = new QStringListModel(this);
	model->setStringList(strlist);
	ui.listView->setModel(model);
}

QtMainPage::~QtMainPage()
{}

QtMainPage.h

#pragma once

#include <QDialog>
#include "ui_QtMainPage.h"
#include<QStringListModel>  //数据模型,储存一组字符串

class QtMainPage : public QDialog
{
	//Qt宏,用于在类中启用Qt的信号和槽机制
	Q_OBJECT

//构造函数,
//接受一个指向QWidget的指针作为参数,
//该参数用于指定父窗口。如果未指定父窗口,则parent参数的默认值为nullptr
public:
	QtMainPage(QWidget *parent = nullptr);
	//析构函数。
	//当DlgLogin对象不再需要时,析构函数会被调用,以执行任何必要的清理操作
	~QtMainPage();

	//列表
private:
	QStringListModel *model;
	QStringList strlist;

	//存储和管理对话框窗口的界面元素
private:
	Ui::QtMainPageClass ui;
};

二、QTreeView

QTreeView实现了 model 中item的树形表示。这个类用于提供标准的层次列表
QTreeView类是model/view类之一,是Qt model/view框架的一部分。
QTreeView实现了由QAbstractItemView类定义的接口,以允许它显示由QAbstractItemModel类派生的模型提供的数据
QtMainPage.cpp

#include "QtMainPage.h"
#include "ui_QtMainPage.h"

#include<QStringListModel>  //数据模型,储存一组字符串

//treeview依赖
#include <QStandardItem>
#include <QStandardItemModel>
#include <QTreeView>

//调试输出
#include <QDebug>

//防止中文乱码
#pragma execution_character_set("utf-8") 

QtMainPage::QtMainPage(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	//星号*是解引用运算符,用于获取指针指向的值
	//QListView *listView = new QListView(this);

	//listview的
	strlist << "第一行内容";
	strlist << "第二行内容";
	model = new QStringListModel(this);
	model->setStringList(strlist);
	ui.listView->setModel(model);

	//treeview
	//视图
	QTreeView  *treeView = new QTreeView;
	//模型
	QStandardItemModel *standardItemModel = new QStandardItemModel;

	//设置列表标题
	standardItemModel->setHorizontalHeaderLabels({"序号","测试事件","电流1/mA","系统时间1", "电流2/mA","系统时间2", "电流3/mA" });
	
	//设置页面标题 如果是单独打开一个列表信息的时候可以在这里设置
	//treeView->setWindowTitle("电池测试数据");
	
	//设置顶层节点
	//第一行(索引为0)设置了一个内容为“第一层数据”的模型顶级项
	standardItemModel->setItem(0, new QStandardItem("第一层数据"));
	standardItemModel->setItem(1,0, new QStandardItem("第二层数据"));

	//设置第一行
	//以下为设置第一个顶层节点(索引为(0, 0 或 0))的子项
	//第一个顶层节点的第一个位置(子项索引为(0, 0)的位置创建了新的QStandardItem,内容为“1”
	//standardItemModel->item(0) 表示内容添加在哪一个顶层节点
	//setChild(0, 0, new QStandardItem("1"));
	//0, 0表示设置子项在几行几列( 0, 0表示设置内容在一行一列)
	//new QStandardItem("1")表示新建一个内容为1的item
	/*拆分写法
	 QStandardItem* root1 = new QStandardItem("第一层数据");
	 QStandardItem* sub11 = new QStandardItem("1");
	 QStandardItem* sub12 = new QStandardItem("0");
     QStandardItem* sub13 = new QStandardItem("0");
	 root1->setChild(0, 0, sub11);
	 root1->setChild(0, 1, sub12);
	 root1->setChild(0,2, sub13);
	 model->setItem(0, root1);
	*/
	standardItemModel->item(0)->setChild(0, 0, new QStandardItem("1"));
	standardItemModel->item(0, 0)->setChild(0, 1, new QStandardItem("0"));
	standardItemModel->item(0, 0)->setChild(0, 2, new QStandardItem("0"));
	standardItemModel->item(0, 0)->setChild(0, 3, new QStandardItem("2024-04-25 10:36:20,780"));
	standardItemModel->item(0, 0)->setChild(0, 4, new QStandardItem("无"));
	standardItemModel->item(0, 0)->setChild(0, 5, new QStandardItem("答复"));
	standardItemModel->item(0, 0)->setChild(0, 6, new QStandardItem("无"));

	//设置第二行
	//第一个顶层节点的第二个位置(子项索引为(1, 0)的位置创建了新的QStandardItem,内容为“2”
	standardItemModel->item(0, 0)->setChild(1, 0, new QStandardItem("2"));
	standardItemModel->item(0, 0)->setChild(1, 1, new QStandardItem("0254"));
	standardItemModel->item(0, 0)->setChild(1, 2, new QStandardItem("543"));
	standardItemModel->item(0, 0)->setChild(1, 3, new QStandardItem("2024-04-25 10:36:20,740"));
	standardItemModel->item(0, 0)->setChild(1, 4, new QStandardItem("问题"));
	standardItemModel->item(0, 0)->setChild(1, 5, new QStandardItem("无"));
	standardItemModel->item(0, 0)->setChild(1, 6, new QStandardItem("无"));

	//设置第三行
	standardItemModel->item(0, 0)->setChild(2, 0, new QStandardItem("3"));
	standardItemModel->item(0, 0)->setChild(2, 1, new QStandardItem("0"));
	standardItemModel->item(0, 0)->setChild(2, 2, new QStandardItem("0"));
	standardItemModel->item(0, 0)->setChild(2, 3, new QStandardItem("2024-04-25 10:36:20,434"));
	standardItemModel->item(0, 0)->setChild(2, 4, new QStandardItem("无"));
	standardItemModel->item(0, 0)->setChild(2, 5, new QStandardItem("暂时"));
	standardItemModel->item(0, 0)->setChild(2, 6, new QStandardItem("无"));

	//以下为设置第二个顶层节点(索引为(1, 0 或 0))
	standardItemModel->item(1, 0)->setChild(0, 0, new QStandardItem("1"));
	standardItemModel->item(1, 0)->setChild(0, 1, new QStandardItem("0"));
	standardItemModel->item(1, 0)->setChild(0, 2, new QStandardItem("0"));
	standardItemModel->item(1, 0)->setChild(0, 3, new QStandardItem("2024-04-25 10:36:20,780"));
	standardItemModel->item(1, 0)->setChild(0, 4, new QStandardItem("无"));
	standardItemModel->item(1, 0)->setChild(0, 5, new QStandardItem("答复"));
	standardItemModel->item(1, 0)->setChild(0, 6, new QStandardItem("无"));
	//把模型设置到视图
	ui.treeView->setModel(standardItemModel);
	// 单独窗口显示视图
	//treeView->setModel(standardItemModel);
	//treeView->show();

	// 加到布局
	//ui.verticalLayout->addWidget(treeView);
}

QtMainPage::~QtMainPage()
{}

效果
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值