目的:最近使用tableview发现使用清空会把原来所有做的样式全部清空掉,不符合我的要求。
所以,特意研究了一下。
1、创建tableview的初始化,以及填充数据项
代码:
头文件:
#ifndef TEXTMODELVIEW_H
#define TEXTMODELVIEW_H
#include <QWidget>
#include <QStandardItemModel>
#include <QJsonArray>
namespace Ui {
class textmodelview;
}
class textmodelview : public QWidget
{
Q_OBJECT
public:
explicit textmodelview(QWidget *parent = nullptr);
~textmodelview();
void initModel();
public slots:
void dataShowSlot(const QJsonArray &data);
private slots:
void on_pushButton_clicked();
private:
QStandardItemModel *focusAreaModel=nullptr;
private:
Ui::textmodelview *ui;
};
#endif // TEXTMODELVIEW_H
.cpp
初始化:
void textmodelview::initModel() //初始化数据模型
{
focusAreaModel =new QStandardItemModel(this);
// 设置行和列数
focusAreaModel->setRowCount(10);
focusAreaModel->setColumnCount(5);
QStringList trackmodelheader;
trackmodelheader << ""<<"经度" << "纬度" << "高度" << "选择";
focusAreaModel->setHorizontalHeaderLabels(trackmodelheader);
for (int row = 0; row < 10; ++row)
{
// 创建标签项,设置标签内容为T1、T2、...、T10
QStandardItem* labelItem = new QStandardItem(QString("T%1").arg(row + 1));
focusAreaModel->setItem(row, 0, labelItem); // 在第一列设置标签项
QStandardItem* Item = new QStandardItem();
Item->setCheckable(true); // 设置为可勾选
Item->setCheckState(Qt::Unchecked); // 初始状态为未勾选
focusAreaModel->setItem(row, 4, Item); // 在第四列设置复选框
}
ui->tableView->setModel(focusAreaModel);
// 隐藏垂直表头
ui->tableView->verticalHeader()->setVisible(false);
// 调整第一列宽度以适应内容大小
ui->tableView->resizeColumnToContents(0);
}
填充数据项:
void textmodelview::on_pushButton_clicked()
{
QJsonArray jsonArray;
for (int i = 0; i < 3; ++i)
{
// 创建一个包含经度、纬度和高度的对象
QJsonObject obj;
obj["经度"] = QRandomGenerator::global()->bounded(static_cast<int>(180.0), static_cast<int>(200.0));
obj["纬度"] = QRandomGenerator::global()->bounded(10, 90);
obj["高度"] = QRandomGenerator::global()->bounded(100, 200);
jsonArray.append(obj);
}
dataShowSlot(jsonArray);
}
2、清空方式1
focusAreaModel->clear();
initModel();
清空后重新初始化,focusAreaModel->clear();会清空所有的样式以及表头
如果不加初始化会变成这样
加了初始化会变得正常
3、清空方式2
利用索引,设置第二列,第三列,第四列的数据为空
int columnStart = 1; // 第二列的索引
int columnEnd = 3; // 第四列的索引
for (int row = 0; row < focusAreaModel->rowCount(); ++row)
{
for (int column = columnStart; column <= columnEnd; ++column)
{
QModelIndex index = focusAreaModel->index(row, column);
focusAreaModel->setData(index, QVariant()); // 设置为空值
}
}
4、清空方式3
利用索引,使用清空的方法,清空第二列,第三列,第四列的数据
int columnStart = 1; // 第二列的索引
int columnEnd = 3; // 第四列的索引
for (int row = 0; row < focusAreaModel->rowCount(); ++row)
{
for (int column = columnStart; column <= columnEnd; ++column)
{
QModelIndex index = focusAreaModel->index(row, column);
focusAreaModel->clearItemData(index);
}
}
经过测试,这三种方法产生的效果都是一样的。