Qt | QListView、QListWidget、QTableView、QTableWidget的使用示例及区别
创始人
2024-02-14 20:05:33
0

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


目录

  • Qt | QListView、QListWidget、QTableView、QTableWidget的使用示例及区别
      • 1、简介
      • 2、使用示例
        • 1、QListView
        • 2、QTableView
        • 3、QListWidget
        • 4、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、使用示例

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(ui->listView->model())->setStringList(strList);// 如果内容有变化需要更新显示,就重新setStringListstrList.append("listview4");qobject_cast(ui->listView->model())->setStringList(strList);// 获取QListView当前的列表内容:首先需要获得QListView的model,通过model获取StringListQStringListModel* m = qobject_cast(ui->listView->model());QStringList items = m->stringList();

效果图:

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"));

效果图:

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

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

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

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

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

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

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

    while(true)  // 循环删除单个就是多删除{// 当前选中项的indexQModelIndexList l = ui->listWidget->selectionModel()->selectedIndexes();if(l.isEmpty())break;// 从QListWidget中删除itemQListWidgetItem* item = ui->listWidget->takeItem(l[0].row());// 必须释放itemdelete item;}

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({"班级一", "班级二", "班级三"});

效果:

添加数据:

    // 设置数据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);

效果:

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

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

效果:

修改单元格内容:

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

获取单元格内容:

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

删除单元格内容:

    // 删除单元格QTableWidgetItem* deleteItem = ui->tableWidget->takeItem(0, 0);if(deleteItem){delete  deleteItem;}

ends…

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...