Qt学习-18 <QTableView>

本文详细介绍了如何使用QTableView和QStandardItemModel创建表格,包括设置表格标题、数据插入与删除、属性调整以及获取和处理选中行数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——  均为自学记录,如有错误请指正


一、简述

参考:QTableView

        QTableView是一种view/model模式在创建QTableView表格的时候,除了创建QTableView对象还需要创建对应的Model对象,Model 对象负责表格中的数据单元添加、单元格删除和设置表格标题等操作,一般常见的就是 QStandardItemModel 模型。

二、创建QTableView

        使用时需要包含以下头文件,创建一个QTableView对象和 QStandardItemModel 并使用QTableView的 setModel() 函数将视图和模型对象进行绑定。

#include <QTableView>
#include <QStandardItemModel>

例:

// .h
#include <QTableView>
#include <QStandardItemModel>

class DBTableView
    : public QTableView
{

public:
    explicit DBTableView(QWidget * _parent_widget = nullptr);
    ~DBTableView() override;

private:
    QStandardItemModel *db_table_model_;

};




// .cpp
#include "db_table_view.h"

DBTableView::DBTableView(QWidget *_parent_widget) : QTableView(_parent_widget)
{
    db_table_model_ = new QStandardItemModel();
    setModel(db_table_model_);
}

DBTableView::~DBTableView()
{

}
1. 表格标题

可以使用 model 对象提供的函数进行表格标题的设置

  • 水平标题    setHorizontalHeaderLabels() 函数
  • 垂直标题    setVerticalHeaderLabels() 函数
DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
    // ......

    QStringList table_h_headers;
    table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";

    db_table_model_->setHorizontalHeaderLabels(table_h_headers);

    QStringList table_v_headers;
    table_v_headers << "测试1" << "测试2" << "测试3" << "测试4"<< "测试5";

    db_table_model_->setVerticalHeaderLabels(table_v_headers);
}

 表格上的所有单元格都是 item 对象,表格标题也不例外,因此可以单独创建 item 对象,然后通过 model 的两个函数依次对表格进行标题设置。

例:

DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
	// ......

    QStringList table_h_headers;
    table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";

    for (int index = 0; index < table_h_headers.count(); ++index) {
        QStandardItem * header_item = new QStandardItem(table_h_headers[index]);
        db_table_model_->setHorizontalHeaderItem(index, header_item);
    }
}

注:这种做法适用于对表格标题需要添加一些数据的时候,

例如当前的模型描述的数据库中的数据表,标题的显示文字可以写成中文,然后将其对应的数据库字段作为附加信息通过 setData() 函数写到对象中。代码:

#include "db_table_view.h"

#define DATABASE_FIELD_CODE         Qt::UserRole + 100

DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
    // ......

    QStringList table_h_headers;
    table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";

    QStringList table_h_fields;
    table_h_fields << "id" << "name" << "level" << "config"<< "date";

    for (int index = 0; index < table_h_headers.count(); ++index) {
        QStandardItem * header_item = new QStandardItem(table_h_headers[index]);
        header_item->setData(table_h_fields[index], DATABASE_FIELD_CODE);
        db_table_model_->setHorizontalHeaderItem(index, header_item);
    }
}
2. 获取表格的标题
  • 可以通过 modelcolumnCount() 函数获取数量;
  • 配合 modelheaderData() 函数获取当前列的文字内容。

例:

DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
	// ......
    QStringList table_h_headers;
    table_h_headers << "设施ID" << "设施名称" << "设施等级" << "人员配置"<< "数据采集日期";
    db_table_model_->setHorizontalHeaderLabels(table_h_headers);

    for (int index = 0; index < db_table_model_->columnCount(); ++index) {
        qInfo() << db_table_model_->headerData(index, Qt::Horizontal, Qt::DisplayRole).toString();
    }
}

注: headerData() 函数的3个参数:

  • 参数1:列的索引号;
  • 参数2:获取水平/垂直方向的表头;
  • 参数3:模型数据编号,该编号与 setData() 函数在设置时一致(此处的Qt::DisplayRole是内置的一个编号,用于获取显示的文字内容)。

三、数据操作

1. 插入数据

可以使用 model 的函数

  • setItem() 函数 :  需要指定设置的行和列
  • appendRow() 函数 :  可以先将一行 item 的对象添加到一个list中,然后一次性插入

例:

DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
    // ......

    db_table_model_->setItem(0, 0, new QStandardItem("1"));
    db_table_model_->setItem(0, 1, new QStandardItem("2"));
    db_table_model_->setItem(0, 2, new QStandardItem("3"));
    db_table_model_->setItem(0, 3,new QStandardItem("4"));
    db_table_model_->setItem(0, 4,new QStandardItem("5"));

    QList<QStandardItem*> add_items;

    for (int index = 0; index < table_h_headers.count(); index++) 
    {
        add_items << new QStandardItem(QString::number(index));
    }

    db_table_model_->appendRow(add_items);
}

2. 删除数据

model 对象提供了以下函数

clear() 函数 :可以一次将表格内容和表格标题都删掉

removeRows() 函数:删除某一列数据

rowCount() 函数:配合 removeRows() 函数 将表格内容清空

例:

// 删除一列数据
DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
    // ......
    db_table_model_->removeColumn(0);
}



// 全部清空
DBTableView::DBTableView(QWidget *_parent_widget)
    : QTableView(_parent_widget)
{
    // ......
    db_table_model_->removeRows(0, db_table_model_->rowCount());
}

四、属性设置

1. 设置表格的对齐方式
horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
verticalHeader()->setDefaultAlignment(Qt::AlignBottom);
2. 设置表格的宽高
// 固定表格宽度不可扩展,不可手动调整宽度
horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格宽度随内容自动扩展
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格宽度自动根据UI进行计算,不可手动调整宽度
horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);


// 固定表格高度不可扩展,不可手动调整高度
verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
// 表格高度随内容自动扩展
verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
// 表格高度自动根据UI进行计算,不可手动调整高度
verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
3. 设置表格的线属性
// 隐藏网格线
setShowGrid(false);
// 显示网格线
setShowGrid(true);
// 线的样式
setGridStyle(Qt::DotLine);

五、获取某一行一列的数据

参考:QTableView

六、获取选中行指定列的内容

参考:QTableView

七、获取某行所有信息

参考:QTableView

// 1. 信号槽

//显示信息
connect(ui->tableView,SIGNAL(clicked(QModelIndex)),this,SLOT(show_list()));

// 2.获取当前行的行号
    
int row = ui-> tableView ->currentIndex().row();
qDebug()<<row;


// 3.获取当前行的所有信息

for(i = 0; i < 4; i++)

{
    qDebug()<<ui->tableView->model()->index(index.row(),i).data().toString();
}

// 槽函数

void show_list()
{

}

八、获取当前选中行

参考:订阅专栏,解锁全文(想看看不了..)

参考:QTableView

QList<int> MainWindow::getSelectedTaskIdList()
{
	QTableView *m_pTableView = ui.tableView;

    //选中当前行
	QModelIndexList selected = m_pTableView->selectionModel()->selectedRows();

    //返回选中当前行的行号
	QList<int> rows;
	foreach( const QModelIndex & index, selected)
	{
		rows.append( index.row() );
	}
	return rows;
}

#include "iotangledlg.h" #include "ui_iotangleproduct.h" #include <QAction> #include <QMenuBar> #include <QMessageBox> #include <QStatusBar> #include <QToolBar> #include <QFileDialog> #include <QCheckBox> #include <QLabel> #include <QLayout> #include <QIcon> #include <QComboBox> #include <QRegExp> IotAngleProduct::IotAngleProduct(QWidget *parent) : QMainWindow(parent), ui(new Ui::IotAngleProduct) { ui->setupUi(this); ui->sizeTableWidget->setColumnCount(1); ui->baseInfoTableWidget->setColumnCount(5); ui->nestInfoTableWidget->setColumnCount(7); ui->workPieceTableWidget->setColumnCount(5); ui->sizeTableWidget->setHorizontalHeaderLabels(QStringList() << tr("规格")); ui->baseInfoTableWidget->setHorizontalHeaderLabels(QStringList() << tr("件号") << tr("长度")<< tr("数量")<< tr("未套数")<< tr("待加工数")); ui->nestInfoTableWidget->setHorizontalHeaderLabels(QStringList() << tr("规格") << tr("料长")<< tr("根数")<< tr("未加工根数")<<tr("余料")<< tr("损耗")<<("状态")); ui->workPieceTableWidget->setHorizontalHeaderLabels(QStringList() << tr("") << tr("构件编号") << tr("长度") << tr("加工数")<<tr("齐套(差几根)")); ui->sizeTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->baseInfoTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); ui->nestInfoTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); ui->workPieceTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); this->setWindowIcon(QIcon("title.jpg")); //添加头部的标题栏"文件" openAction = new QAction(tr("打开"), this); connect(openAction, &QAction::triggered, this, &IotAngleProduct::open); QMenu *file = menuBar()->addMenu(tr("&文件")); file->addAction(openAction); initMesTableView(); QAction* mesAction = new QAction(tr("从MES系统获取任务"), this); connect(mesAction, &QAction::triggered, this, &IotAngleProduct::onGetMesTaskTriggered); QMenu *mesMenu = menuBar()->addMenu
03-12
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>803</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>天气情况分析</string> </property> <widget class="QWidget" name="centralwidget"> <widget class="QTabWidget" name="tabWidget"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>801</width> <height>551</height> </rect> </property> <property name="styleSheet"> <string notr="true">background-color: qlineargradient(spread:pad, x1:0.484346, y1:1, x2:0.479, y2:0, stop:0 rgba(158, 214, 255, 255), stop:1 rgba(255, 255, 255, 255));</string> </property> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> <string>数据预处理</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>选择与清洗</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="pushButton"> <property name="text"> <string>选择csv文件</string> </property> </widget> </item> <item> <widget class="QComboBox" name="comboBox"> <item> <property name="text"> <string>数值型列:使用KNNImputer填充缺失值</string> </property> </item> <item> <property name="text"> <string>非数值型列:使用该列的众数填充空值</string> </property> </item> <item> <property name="text"> <string>基于全部列删除重复项:使用drop_duplicates()方法删除所有重复的行</string> </property> </item> <item> <property name="text"> <string>异常值处理:使用IQR(四分位距)方法移除数据集数值型列中的异常值</string> </property> </item> <item> <property name="text"> <string>数据格式化和类型转换:对数值型列进行Min-Max归一化</string> </property> </item> <item> <property name="text"> <string>数据排序:根据索引排序</string> </property> </item> <item> <property name="text"> <string>数据存储:使用to_csv()方法将清洗后的数据存储到一个cleaned.csv文件中</string> </property> </item> </widget> </item> </layout> </widget> </item> <item> <widget class="QTableView" name="tableView"/> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>可视化</string> </attribute> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>可视化选项</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QPushButton" name="pushButton_2"> <property name="text"> <string>温度、气压、湿度随时间变化的折线图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_3"> <property name="text"> <string>不同站点PM2.5的柱状图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_4"> <property name="text"> <string>累积降水量·的面积图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_5"> <property name="text"> <string>各站点颗粒物浓度的散点图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_6"> <property name="text"> <string>气象玫瑰图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_7"> <property name="text"> <string>气象和污染物指标的雷达图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_8"> <property name="text"> <string>箱线图展示数据分布</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGraphicsView" name="graphicsView"/> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>算法建模</string> </attribute> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QGroupBox" name="groupBox_3"> <property name="title"> <string>算法选项</string> </property> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <widget class="QPushButton" name="pushButton_9"> <property name="text"> <string>线性回归</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_10"> <property name="text"> <string>移动平均</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_11"> <property name="text"> <string>时间序列分解</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_12"> <property name="text"> <string>经典时间序列预测模型</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGraphicsView" name="graphicsView_2"/> </item> </layout> </widget> </widget> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>803</width> <height>33</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui> 如果我要用网页实现上述ui文件的功能,怎么写python代码,已知要处理的cav文件有五万多行数据
最新发布
06-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值