• Qt | QListView、QListWidget、QTableView、QTableWidget的使用示例及区别


    Qt | QListView、QListWidget、QTableView、QTableWidget的使用示例及区别



    1、简介

    QListView、QListWidget是列表形式展示的控件。

    QTableView、QTableWidget是表格形式展示控件。

    继承关系:带Widget的继承自View,即:QListWidget是继承QListView,QTableWidget继承自QTableView。

    区别:QListView是基于Model,而QListWidget基于Item。这是它们的本质区别。QTableView、QTableWidget同理。

    由于QListView和QTableView是基于model的,需要自己来建模(例如建立QStringListModel、QSqlTableModel等),保存数据,这样就大大降低了数据冗余,提高了程序的效率,以及能更方便的进行我们自己需要展示的内容,但是需要我们对数据建模有一定了解。

    而QListWidget相当于是QListView的升级版,它已经自己为我们建立了一个数据存储模型(QListWidgetItem),操作方便,直接调用addItem即可添加项目(ICON,文字)。QTableView、QTableWidget同理。


    2、使用示例

    这四个类共有的一些设置包括:

    • 交替行颜色显示:
      void setAlternatingRowColors(bool enable);
      
      • 1
    • 设置选中模式:
      void setSelectionMode(QAbstractItemView::SelectionMode mode);
      
      • 1
    • 设置视图模式,包含列表模式和图标模式:
      void setViewMode(ViewMode mode);
      
      • 1
    1、QListView

    向QListView中添加条目需借助QAbstractListModel,这里我使用字符串列表模型(QStringListModel)进行示例。

        // 设置string模型
        QStringListModel* strListModel = new QStringListModel(this);
        ui->listView->setModel(strListModel);
    
        // 设置选中模式为扩展模式,即可多选也可单选
        ui->listView->setSelectionMode(QListView::ExtendedSelection);
    
        // 设置显示
        QStringList strList = {"listview1", "listview2", "listview3"};
        qobject_cast<QStringListModel*>(ui->listView->model())->setStringList(strList);
    
        // 如果内容有变化需要更新显示,就重新setStringList
        strList.append("listview4");
        qobject_cast<QStringListModel*>(ui->listView->model())->setStringList(strList);
    
        // 获取QListView当前的列表内容:首先需要获得QListView的model,通过model获取StringList
        QStringListModel* m = qobject_cast<QStringListModel*>(ui->listView->model());
        QStringList items = m->stringList();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    效果图:

    2、QTableView

    见博客:https://blog.csdn.net/qq153471503/article/details/123423931

    3、QListWidget

    QListWidget使用起来更简单,直接使用addItem添加即可。

        // 设置选中模式
        ui->listWidget->setSelectionMode(QListWidget::ExtendedSelection);
    
        // 添加一项
        ui->listWidget->addItem("listwidget1");
    
        // 添加一项(带图标)
        ui->listWidget->addItem(new QListWidgetItem(QIcon(QPixmap(100, 100)), "listwidget2"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    效果图:

    QListWidget添加条目比较简单,但是删除需要额外注意!

    QListWidget提供了两个函数:removeItemWidgettakeItem,两者的区别:

    • removeItemWidget:只是删除该item对应的widget,不会删除该item,如果这个item存在内容还是会保留显示
    • takeitem直接删除该item
    • clear函数清除所有的item

    所以,如果想真正的删除一项,需要使用takeitem。

    在使用takeitem时有两点需要注意:

    • 该函数执行成功会返回一个QListWidgetItem对象,并且需要手动的delete,若执行失败则返回nullptr
    • 每成功的执行一次takeitem,列表内容的索引都会重新更新。

    以下示例为删除选中的item:

        while(true)  // 循环删除单个就是多删除
        {
            // 当前选中项的index
            QModelIndexList l = ui->listWidget->selectionModel()->selectedIndexes();
    
            if(l.isEmpty())
                break;
    
            // 从QListWidget中删除item
            QListWidgetItem* item = ui->listWidget->takeItem(l[0].row());
    
            // 必须释放item
            delete item;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    4、QTableWidget
        // 设置水平拉伸显示,这样比较好看
        ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    
        // 设置行数
        ui->tableWidget->setRowCount(3);
    
        // 设置列数
        ui->tableWidget->setColumnCount(3);
    
        // 设置垂直表头
        ui->tableWidget->setVerticalHeaderLabels({"1月", "2月", "3月"});
    
        // 设置水平表头
        ui->tableWidget->setHorizontalHeaderLabels({"班级一", "班级二", "班级三"});
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    效果:

    添加数据:

        // 设置数据
        ui->tableWidget->setItem(0, 0, new QTableWidgetItem("item11"));
        ui->tableWidget->setItem(1, 0, new QTableWidgetItem("item21"));
    
        // 设置数据
        QTableWidgetItem* item = new QTableWidgetItem("item12");
        item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);  // 居中显示
        item->setFlags(Qt::ItemIsEnabled);  // 设置为不可编辑
        ui->tableWidget->setItem(0, 1, item);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    效果:

    将单元格设置成QComboBox,使单元格支持下拉选择:

        // 将单元格设置成QComboBox
        QComboBox* comboBox = new QComboBox();
        comboBox->addItems({"abc", "def"});
        ui->tableWidget->setCellWidget(0, 2, comboBox);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    效果:

    修改单元格内容:

        // 修改数据,修改前注意要检查修改的这个单元格有没有item
        QTableWidgetItem* channgeItem = ui->tableWidget->item(0, 0);
        if(channgeItem)
        {
            channgeItem->setText(channgeItem->text() + "-channged");
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    获取单元格内容:

        // 获取普通单元格的数据
        qDebug() << ui->tableWidget->item(0, 0)->text();
    
        // 获取QComboBox单元格的数据
        qDebug() << qobject_cast<QComboBox*>(ui->tableWidget->cellWidget(0, 2))->currentText();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除单元格内容:

        // 删除单元格
        QTableWidgetItem* deleteItem = ui->tableWidget->takeItem(0, 0);
        if(deleteItem)
        {
            delete  deleteItem;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ends…

  • 相关阅读:
    GBase 8s ALTER FRAGMENT 语句 MODIFY子句(三)
    docker 安装gitlab,配置邮件,备份全流程
    AK F.*ing leetcode 流浪计划之delaunay三角化
    LVS-keepalived实现高可用
    vue项目启动npm run ‘配置‘(读取的配置信息详情)
    金融学习资料维护库
    monkey 压测
    HBase安装部署
    鉴源论坛丨信号基础设备概述
    Pytest参数详解 — 基于命令行模式
  • 原文地址:https://blog.csdn.net/qq153471503/article/details/128037537