Qt学习笔记#第六章:ItemViews & ItemWidgets

本文详细介绍了Qt框架中的ListWidget、ListView、TreeWidget和TreeView组件,包括它们的数据模型、显示模式、定制化选项、选择模式以及信号和槽的使用。展示了如何通过实例代码操作这些控件以实现列表、树形和表格的展示与交互。
摘要由CSDN通过智能技术生成
1. ListWidget 和 ListView

ListWidget是一个基于Qt Widgets的类,用于在窗口部件中展示垂直列表。它可以包含多个 QListWidgetItem 对象,每个对象代表列表中的一个项目。ListWidget提供了丰富的方法来管理和操作项目,例如添加、移除、更新、排序等。

简单实现ListWidget

#include <QListWidget>

    //这里直接用ui拖进去listwidget控件
    QListWidgetItem *qitem=new QListWidgetItem("标题"); //标题
    ui->listWidget->addItem(qitem); //将这一项添加进listWidget中
    qitem->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); //设置垂直居中

    QStringList slist;
    slist<<"111222";
    slist<<"333444";
    ui->listWidget->addItems(slist); //将slist中的数据添加进listWidget中
  1. 数据模型:QListView需要通过数据模型来提供数据。常用的数据模型包括QStandardItemModel和QAbstractListModel等,你可以根据需求选择适合的数据模型。

  2. 数据模型:QListView需要通过数据模型来提供数据。常用的数据模型包括QStandardItemModel和QAbstractListModel等,你可以根据需求选择适合的数据模型。

  3. 显示模式:QListView支持多种显示模式,包括List模式(默认)、Icon模式、Flow模式和Tree模式等。你可以根据实际需求选择最合适的显示模式。

  4. 定制化:你可以通过设置委托(Delegate)来定制列表项的外观和交互。使用委托可以自定义每个列表项的样式、大小、显示内容等。

  5. 选择模式:QListView支持多种选择模式,例如单选、多选和扩展选择等。你可以通过设置选择模式来控制用户对列表项的选择方式。

  6. 信号和槽:QListView提供了一系列信号,以便在列表项被点击、双击或选择状态改变时进行响应。你可以连接这些信号与槽函数,实现相应的交互逻辑。

#include <QListView>
#include <QStringListModel> // 字符串列表模型
#include <QMessageBox>

private:
    QListView *listview1;
private slots:
    void SlotClickedFunc(const QModelIndex &index);

//cpp文件
 listview1=new QListView(this);  // 创建QListView对象
    listview1->setGeometry(20,20,240,160); // 设置控件显示位置和控件大小

    QStringList qlist; // 创建数据显示至清单视图(之前),将数据加载到模型中
    qlist.append("运动类:篮球、足球");
    qlist.append("娱乐类:看电影、写小说、听音乐");
    qlist.append("游戏类:五子棋、扑克牌、中国象棋");
    qlist.append("旅游类:国外旅游、国内旅游");

    // 他用数据列表创建数据显示模型进行实现
    QStringListModel *listmode=new QStringListModel(qlist);
    listview1->setModel(listmode);

    connect(listview1,SIGNAL(clicked(const QModelIndex)),this,SLOT(SlotClickedFunc(const QModelIndex)));
}
void Widget::SlotClickedFunc(const QModelIndex &index)
{
    QMessageBox::information(NULL,"兴趣爱好","你选择的类型为\n"+index.data().toString());
}
2. TreeWidget 和TreeView

treewidget

  1. 数据模型:QTreeWidget通过QTreeWidgetItem对象来组织数据。你可以通过QTreeWidget的接口添加、删除、更新和遍历树节点。

  2. 显示模式:QTreeWidget支持树形结构的展示方式,每个节点可以包含多个子节点。默认情况下,QTreeWidget将节点和子节点展开或收起,以便用户浏览完整的树形结构。

#include <QTreeWidget>

//通过ui拖控件创建控件
 // 1:添加第一级节点
    QTreeWidgetItem *topItem1=new QTreeWidgetItem(ui->treeWidget);
    topItem1->setText(0,"清华大学"); 
    topItem1->setCheckState(0,Qt::Checked);
    ui->treeWidget->addTopLevelItem(topItem1);

    // 隐藏表头
    ui->treeWidget->setHeaderHidden(true);
    // 展开节点
    ui->treeWidget->expandAll();

    // 2:二级节点添加到一级节点的topItem1
    QTreeWidgetItem *item11=new QTreeWidgetItem(topItem1);
    item11->setText(0,"清华大学建筑学院");
    item11->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item12=new QTreeWidgetItem(topItem1);
    item12->setText(0,"清华大学建筑学院");
    item12->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item13=new QTreeWidgetItem(topItem1);
    item13->setText(0,"清华大学土木学院");
    item13->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item14=new QTreeWidgetItem(topItem1);
    item14->setText(0,"清华大学信息科学技术学院");
    item14->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item15=new QTreeWidgetItem(topItem1);
    item15->setText(0,"清华大学马克思主义学院");
    item15->setCheckState(0,Qt::Checked);

    // 3:添加第一级节点
    QTreeWidgetItem *topItem2=new QTreeWidgetItem(ui->treeWidget);
    topItem2->setText(0,"北京大学");
    topItem2->setCheckState(0,Qt::Checked);
    ui->treeWidget->addTopLevelItem(topItem2);

    QTreeWidgetItem *item21=new QTreeWidgetItem(topItem2);
    item21->setText(0,"北京大学数学科学学院");
    item21->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item22=new QTreeWidgetItem(topItem2);
    item22->setText(0,"北京大学软件与微电子学院");
    item22->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item23=new QTreeWidgetItem(topItem2);
    item23->setText(0,"北京大学新闻与传播学院");
    item23->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item24=new QTreeWidgetItem(topItem2);
    item24->setText(0,"北京大学光华管理学院");
    item24->setCheckState(0,Qt::Checked);

    QTreeWidgetItem *item25=new QTreeWidgetItem(topItem2);
    item25->setText(0,"北京大学医学部");
    item25->setCheckState(0,Qt::Checked);

QTreeView

  1. 数据模型:QTreeView需要通过数据模型来提供树形数据。常用的数据模型包括QStandardItemModel和QAbstractItemModel等,你可以根据需求选择适合的模型。

  2. 显示模式:与QTreeWidget相似,QTreeView支持树形结构的展示方式,每个节点可以包含多个子节点。不同的是,QTreeView可以根据需要展开或折叠树节点,以便用户浏览和操作树形结构。

  3. 定制化:你可以通过设置委托(Delegate)来定制树节点的外观和交互。使用委托可以自定义每个树节点的样式、大小、显示内容等。

  4. 信号和槽:QTreeView提供了一系列信号,以便在树节点被点击、双击或选择状态改变时进行响应。你可以连接这些信号与槽函数,实现相应的交互逻辑。

  5. 其他功能:QTreeView还支持排序、过滤、拖放和重排等功能。你可以根据具体需求使用这些功能来增强树形结构的功能和用户体验。

#include <QStandardItemModel>
    void InitTreeViewFunc(); // 初始化树控件视图
    QStandardItemModel *sItemMode ,*mModel;

void MainWindow::InitTreeViewFunc() // 初始化树视图控件
{
    // 1:构造model
    sItemMode = new QStandardItemModel(ui->treeView);
    sItemMode->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("编号") << QStringLiteral("初中|高中"));     //设置水平列头

    // 创建一级节点,将它加入到sItemModel
    QList<QStandardItem*> item11;
    QStandardItem *item1=new QStandardItem(QString::number(1));
    QStandardItem *item2=new QStandardItem("初中");
    item11.append(item1);
    item11.append(item2);
    sItemMode->appendRow(item11); 


    // 二级节点,添加到第一个一级节点
    QList<QStandardItem*> item112;
    QStandardItem *item1121=new QStandardItem(QString::number(2));
    QStandardItem *item1122=new QStandardItem(QStringLiteral("一年级"));

    item112.append(item1121);
    item112.append(item1122);
    item1->appendRow(item112);

    // 三级节点,添加到第一个二级节点
    QList<QStandardItem*> item1231;
    QStandardItem *item12311=new QStandardItem(QString::number(3));
    QStandardItem *item12312=new QStandardItem(QStringLiteral("一班"));
    item1231.append(item12311);
    item1231.append(item12312);
    item1121->appendRow(item1231);

    QList<QStandardItem*> item1232;
    QStandardItem *item12321=new QStandardItem(QString::number(3));
    QStandardItem *item12322=new QStandardItem(QStringLiteral("二班"));
    item1232.append(item12321);
    item1232.append(item12322);
    item1121->appendRow(item1232);

    QList<QStandardItem*> item1233;
    QStandardItem *item12331=new QStandardItem(QString::number(3));
    QStandardItem *item12332=new QStandardItem(QStringLiteral("三班"));
    item1233.append(item12331);
    item1233.append(item12332);
    item1121->appendRow(item1233);

    // 创建一级节点,将它加入到sItemModel
    QList<QStandardItem*> item12;

    QStandardItem *item3=new QStandardItem(QString::number(2));
    QStandardItem *item4=new QStandardItem("高中部");

    item12.append(item3);
    item12.append(item4);
    sItemMode->appendRow(item12);

    // 2:给QTreeView应用model
    ui->treeView->setModel(sItemMode);

}
3. TableWidget 和 TableView

QTableWidget

  1. 数据模型:QTableWidget通过QTableWidgetItem对象来组织数据。你可以通过QTableWidget的接口添加、删除、更新和遍历表格行和列。

  2. 表格布局:QTableWidget以行和列的形式呈现数据,每个单元格都可以包含文本、图标或自定义的小部件。你可以使用QTableWidget的接口设置行数、列数、单元格内容和样式。

  3. 定制化:你可以通过设置委托(Delegate)来定制表格单元格的外观和交互。使用委托可以自定义单元格的编辑方式、格式化显示等。

  4. 信号和槽:QTableWidget提供了一系列信号,以便在单元格被点击、双击或选择状态改变时进行响应。你可以连接这些信号与槽函数,实现相应的交互逻辑。

  5. 其他功能:QTableWidget还支持排序、过滤、拖放和编辑等功能。你可以根据具体需求使用这些功能来增强表格的功能和用户体验。

 // 设置表格行数和列数
    ui->tableWidget->setRowCount(3);
    ui->tableWidget->setColumnCount(2);

    // 设置水平表头
    QStringList slist;
    slist<<"学号"<<"高考分数";
    ui->tableWidget->setHorizontalHeaderLabels(slist);

    QList<QString> strno;
    strno<<"202201"<<"202202"<<"202203";
    QList<QString> strscore;
    strscore<<"708"<<"712"<<"690";

    // 通过循环为表格赋值
    for(int i=0;i<3;i++)
    {
        int iCol=0;
        QTableWidgetItem *pitem=new QTableWidgetItem(strno.at(i));
        ui->tableWidget->setItem(i,iCol++,pitem);
        ui->tableWidget->setItem(i,iCol,new QTableWidgetItem(strscore.at(i))); //添加模型到表
    }

TableView

  1. 数据模型:QTableView通过数据模型(例如QStandardItemModel、QAbstractTableModel等)来提供表格数据。数据模型可以存储和管理表格数据,并且支持对数据进行排序、过滤、编辑等操作。

  2. 视图与模型分离:QTableView将数据的展示与数据的存储和处理分离开来,使得数据的管理更加灵活和可扩展。你可以通过设置不同的数据模型来适应不同的数据结构和需求。

  3. 定制化:你可以通过设置视图委托(Delegate)来定制表格单元格的外观和交互。视图委托可以用于自定义单元格的显示方式、编辑方式、样式等。

  4. 排序和过滤:QTableView支持对表格数据进行排序和过滤,你可以通过设置排序器(Sorter)和过滤器(Filter)来实现这些功能。排序器和过滤器可以根据自定义规则对数据进行排序和筛选。

  5. 信号与槽:QTableView提供了一系列信号,以便在表格数据发生变化、选择状态改变、点击单元格等情况下进行响应。你可以连接这些信号与槽函数,实现相应的交互逻辑。

void MainWindow::InitTableViewFunc()
{
    // 1:添加表头,准备数据模型
    QStandardItemModel *stuMode=new QStandardItemModel();
    stuMode->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("学号")));
    stuMode->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("姓名")));
    stuMode->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("性别")));
    stuMode->setHorizontalHeaderItem(3,new QStandardItem(QObject::tr("分数")));

    // 通过API函数将数据模型绑定到QTableView
    ui->tableView->setModel(stuMode);

    // 设备表格列的宽度
    ui->tableView->setColumnWidth(0,120);

    // 2:添加数据信息
    stuMode->setItem(0,0,new QStandardItem("2022001"));
    stuMode->setItem(0,1,new QStandardItem("张三"));
    stuMode->setItem(0,2,new QStandardItem("男"));
    stuMode->setItem(0,3,new QStandardItem("714"));

    stuMode->setItem(1,0,new QStandardItem("2022002"));
    stuMode->setItem(1,1,new QStandardItem("小花"));
    stuMode->setItem(1,2,new QStandardItem("女"));
    stuMode->setItem(1,3,new QStandardItem("720"));

    stuMode->setItem(2,0,new QStandardItem("2022003"));
    stuMode->setItem(2,1,new QStandardItem("小妮"));
    stuMode->setItem(2,2,new QStandardItem("女"));
    stuMode->setItem(2,3,new QStandardItem("657"));

    // 禁止编辑
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 排序操作
    stuMode->sort(3,Qt::DescendingOrder);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值