0


Qt之QTableView的简单使用(含源码+注释)

文章目录

一、QTableView操作示例图

下图为QTableView简单使用示例图,其中包含设置、获取、新建item等操作,源码在本文第三节(源码含详细注释)。
在这里插入图片描述
提示:不会使用Qt设计师设计界面的小伙伴点击这里

二、QTableView(个人理解)

  1. QTableView是类似MVC(Model View Controller)模式,但在这里的Controller变成了Delegate;
  2. 使用QTableView显示数据需要配合QStandardItemModel,但是其子类QTableWidget则不需要,但是QTableView的可操作性远高于QTableWidget;
  3. 上方说到QTableView的可操作高于QTableWidget,是因为QTableView包含Delegate(代理),Delegate是真正将控件添加到QTableView中的;如setIndexWidget()只是单纯将控件放在item上,当QTableView进行添加/删除操作时,setIndexWidget()的控件不会随着行列改变而改变位置,但通过Delegate设置的控件就不会受影响。 提示:强烈推荐学习QTableView的小伙伴了解Delegate(代理),请查看Qt代理的实现(按钮篇)、Qt代理的实现(常规控件篇)

三、源码

CMainWindow.h

#ifndefCMAINWINDOW_H#defineCMAINWINDOW_H#include<QMainWindow>#include<QStandardItemModel>//数据模型类namespace Ui {classCMainWindow;}classCMainWindow:publicQMainWindow{
    Q_OBJECT

public:explicitCMainWindow(QWidget *parent =0);~CMainWindow();private slots://获取指定位置的值voidon_getIndexDataBtn_clicked();//设置指定位置的值voidon_setIndexDataBtn_clicked();private:
    Ui::CMainWindow     *ui;

    QStandardItemModel  *m_pModel;//数据模型对象指针};#endif// CMAINWINDOW_H

CMainWindow.cpp

#include"CMainWindow.h"#include"ui_CMainWindow.h"CMainWindow::CMainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::CMainWindow){
    ui->setupUi(this);this->setWindowTitle("QTableView简单使用");//建立模型对象空间并指定父对象
    m_pModel =newQStandardItemModel(ui->tableView);//将数据模型设置到表对象上
    ui->tableView->setModel(m_pModel);//! 添加数据(添加数据包含多种方式),我个人主要使用如下几个函数//! 添加指定位置的item: void QStandardItemModel::setItem(int row, int column, QStandardItem *item)//! 添加指定行首列的item: void QStandardItemModel::setItem(int row, QStandardItem *item)//! 追加一列: void appendColumn(const QList<QStandardItem *> &items)//! 追加一行: void appendRow(const QList<QStandardItem *> &items)//循环添加三行数据for(int index =0; index !=3;++index){
        m_pModel->appendRow(QList<QStandardItem *>()<<newQStandardItem(QString("第%1行,第0列").arg(index))<<newQStandardItem(QString("第%1行,第1列").arg(index)));}//添加指定位置的数据
    m_pModel->setItem(3,2,newQStandardItem(QString("第3行,第2列")));}CMainWindow::~CMainWindow(){//! 析构函数://! 有些小伙伴会发现我没有析构model对象,//! 那是因为我在获取对象空间的时候指定了父对象,//! 当其父对象析构时,会先析构其子对象为指针的对象。delete ui;}voidCMainWindow::on_getIndexDataBtn_clicked(){//通过行、列编辑栏获取指定位置的item指针
    QStandardItem *item = m_pModel->item(ui->rowEdit->text().toInt(), ui->columnEdit->text().toInt());//判断指针是否为空,为空则设置提示并返回if(nullptr== item){
        ui->valueEdit->setText("指定的item不存在");return;}//获取item的值并设置到值编辑框中
    ui->valueEdit->setText(item->text());}voidCMainWindow::on_setIndexDataBtn_clicked(){//通过行、列编辑栏获取指定位置的item指针
    QStandardItem *item = m_pModel->item(ui->rowEdit->text().toInt(), ui->columnEdit->text().toInt());//判断指针是否为空if(nullptr== item){//为空则新建item设置到数据模型对象中
        m_pModel->setItem(ui->rowEdit->text().toInt(), ui->columnEdit->text().toInt(),newQStandardItem(ui->valueEdit->text()));}else{//不为空则直接获取值设置到item中
        item->setText(ui->valueEdit->text());}}

四、拓展:代理的使用

代理的使用步骤:

  1. 创建代理对象指针
  2. 连接信号槽
  3. 设置代理位置 提示:设置好后在其设置的位置会自动创建代理控件(常规控件需要双击调用)
//new出代理对象,并设置到相应列
    m_delegate =new CButtonDelegate;connect(m_delegate,&CButtonDelegate::clicked,this,&CMainWindow::on_itemClick);//连接槽函数
    ui->tableView->setItemDelegateForColumn(2, m_delegate);

总结

虽然QTableView使用稍微繁琐,但是QTableView比QTableWidget灵活度更高,我个人建议尽量使用QTableView。对于代理,要是能掌握更好,因为其不但能提供不同控件,并且提供的控件不model的行列变化影响。
最后,好久不见,继续加油吧!

相关文章

Qt代理的实现(按钮篇,含源码+注释)
Qt代理的实现(常规控件篇,含源码+注释)
Qt之QTableView设置多列表头复选框(自定义QHeaderView)、单元格复选框(含源码+注释)
Qt之QSortFilterProxyModel的简单使用(QTableView搜索功能,含源码+注释)
Qt之QTreeView的简单使用(含源码+注释)
Qt之QListView的简单使用(含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

标签: qt ui 开发语言

本文转载自: https://blog.csdn.net/wj584652425/article/details/125021312
版权归原作者 lw只吃亿点. 所有, 如有侵权,请联系我们删除。

“Qt之QTableView的简单使用(含源码+注释)”的评论:

还没有评论