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同理。
这四个类共有的一些设置包括:
void setAlternatingRowColors(bool enable);
void setSelectionMode(QAbstractItemView::SelectionMode mode);
void setViewMode(ViewMode mode);
向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();
效果图:
见博客:https://blog.csdn.net/qq153471503/article/details/123423931
QListWidget使用起来更简单,直接使用addItem添加即可。
// 设置选中模式
ui->listWidget->setSelectionMode(QListWidget::ExtendedSelection);
// 添加一项
ui->listWidget->addItem("listwidget1");
// 添加一项(带图标)
ui->listWidget->addItem(new QListWidgetItem(QIcon(QPixmap(100, 100)), "listwidget2"));
效果图:
QListWidget添加条目比较简单,但是删除需要额外注意!
QListWidget提供了两个函数:removeItemWidget
和takeItem
,两者的区别:
所以,如果想真正的删除一项,需要使用takeitem。
在使用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;
}
// 设置水平拉伸显示,这样比较好看
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,使单元格支持下拉选择:
// 将单元格设置成QComboBox
QComboBox* comboBox = new QComboBox();
comboBox->addItems({"abc", "def"});
ui->tableWidget->setCellWidget(0, 2, comboBox);
效果:
修改单元格内容:
// 修改数据,修改前注意要检查修改的这个单元格有没有item
QTableWidgetItem* channgeItem = ui->tableWidget->item(0, 0);
if(channgeItem)
{
channgeItem->setText(channgeItem->text() + "-channged");
}
获取单元格内容:
// 获取普通单元格的数据
qDebug() << ui->tableWidget->item(0, 0)->text();
// 获取QComboBox单元格的数据
qDebug() << qobject_cast<QComboBox*>(ui->tableWidget->cellWidget(0, 2))->currentText();
删除单元格内容:
// 删除单元格
QTableWidgetItem* deleteItem = ui->tableWidget->takeItem(0, 0);
if(deleteItem)
{
delete deleteItem;
}
ends…