Qt学习-18 <QTableView>

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


一、简述

参考: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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值