• QStandardItmeModel


    表格视图控件QTableView,需要和QStandardItemModel, 配套使用,这套框架是基于MVC设计模式设计的,M(Model)是QStandardItemModel数据模型,

    不能单独显示出来。V(view)是指QTableView视图,要来显示数据模型,C(controllor)控制在Qt中被弱化,与View合并到一起。

    1 QTableView简单应用

    QStandardItmeModel表格的数据模型,那么这个模型需要填上每一行每一列的数据,就像execl表格一样。

    widget.h

     
    
    1. #ifndef WIDGET_H
    2. #define WIDGET_H​
    3. #include
    4. class Widget : public QTableView //继承至QTableView
    5. {
    6. Q_OBJECT
    7. public:
    8. Widget(QWidget *parent = );
    9. ~Widget();
    10. };
    11. #endif // WIDGET_H

    widget.cpp

     
    
    1. #include "widget.h"
    2. #include
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QTableView(parent)
    6. {
    7. QStandardItemModel* model = new QStandardItemModel(this);
    8. model->setItem(, , new QStandardItem("张三"));
    9. model->setItem(, , new QStandardItem(""));
    10. model->setItem(, , new QStandardItem("男"));
    11. this->setModel(model);
    12. }
    13. Widget::~Widget()
    14. {
    15. }

    以上代码实现了在model中添加一条数据,然后通过setModel函数设置view的数据模型为model,显示出来,如图:

    2 修改行列字段名

    修改字段名可以使用QStandardItemModel::setHeaderData,但是在这之前你需要调用QStandardItemModel::setColumnCountQStandardItemModel::setRowCount,例如:

     
    
    1. Widget::Widget(QWidget *parent)
    2. : QTableView(parent)
    3. {
    4. QStandardItemModel* model = new QStandardItemModel(this);
    5. /*设置列字段名*/
    6. model->setColumnCount();
    7. model->setHeaderData(,Qt::Horizontal, "姓名");
    8. model->setHeaderData(,Qt::Horizontal, "年龄");
    9. model->setHeaderData(,Qt::Horizontal, "性别");
    10. /*设置行字段名*/
    11. model->setRowCount();
    12. model->setHeaderData(,Qt::Vertical, "记录一");
    13. model->setHeaderData(,Qt::Vertical, "记录二");
    14. model->setHeaderData(,Qt::Vertical, "记录三");
    15. /*设置一条数据*/
    16. model->setItem(, , new QStandardItem("张三"));
    17. model->setItem(, , new QStandardItem(""));
    18. model->setItem(, , new QStandardItem("男"));
    19. this->setModel(model);
    20. }

    把1中的构造函数换为以上代码,运行即可得出下图:

    3 移除数据

    移除数据的常用函数有:

     
    
    1. /*移除某行数据*/
    2. bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex())
    3. /*移除某列数据*/
    4. bool QAbstractItemModel::removeColumn(int column, const QModelIndex &parent = QModelIndex())

    例如:

     
    
    1. model->removeRow();//移除第0行数据
    2. model->removeColumn();//移除第0列数据

    4 插入数据

    插入一行数据:

     
    
    1. void QStandardItemModel::insertRow(int row, const QList &items)
    2. /*
    3. * row 表示从第几行插入数据
    4. * items 表示要插入的数据QStandardItem对象
    5. */

    例如:

     
    
    1. QList list;
    2. list << new QStandardItem("王五") << new QStandardItem("") << new QStandardItem("男");
    3. model->insertRow(, list); //在第0行插入一条记录

    5 数据变更信号处理

    当QStandardModel中的数据被更改的时候,会发射出dataChanged信号:

     
    
    1. [signal] void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector ());
    2. /*
    3. *topLeft bottomRight这两索引指的是表格中被更改数据的区域,如果只有一个数据被更改,那么topLeft等于bottomRight
    4. */

    例如:

    widget.h

     
    
    1. #ifndef WIDGET_H
    2. #define WIDGET_H​
    3. #include
    4. class QStandardItemModel;
    5. class Widget : public QTableView
    6. {
    7. Q_OBJECT
    8. public slots:
    9. void dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight,
    10. const QVector &roles = QVector ());
    11. public:
    12. Widget(QWidget *parent = );
    13. QStandardItemModel* model;
    14. ~Widget();
    15. };
    16. #endif // WIDGET_H

    widget.cpp

     
    
    1. #include "widget.h"
    2. #include
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QTableView(parent)
    6. {
    7. model = new QStandardItemModel(this);
    8. model->setColumnCount();
    9. model->setHeaderData(,Qt::Horizontal, "姓名");
    10. model->setHeaderData(,Qt::Horizontal, "年龄");
    11. model->setHeaderData(,Qt::Horizontal, "性别");
    12. model->setRowCount();
    13. model->setHeaderData(,Qt::Vertical, "记录一");
    14. model->setHeaderData(,Qt::Vertical, "记录二");
    15. model->setHeaderData(,Qt::Vertical, "记录三");
    16. model->setItem(, , new QStandardItem("张三"));
    17. model->setItem(, , new QStandardItem(""));
    18. model->setItem(, , new QStandardItem("男"));
    19. connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector)), this, SLOT(dataChangedSlot(QModelIndex,QModelIndex,QVector)));
    20. this->setModel(model);
    21. }
    22. void Widget::dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles)
    23. {
    24. qDebug() << model->data(topLeft).toString() << endl;
    25. }
    26. Widget::~Widget()
    27. {
    28. }

    需要知道的是函数data可以获取想要的QStandardItem对象的索引:

     
    
    1. [pure virtual] QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

    返回的QVariant对象是一种泛型变量,可以转换成QString、int、double等数据类型。

    6 常用函数

     
    
    1. //默认显示行头,如果你觉得不美观的话,我们可以将隐藏
    2. tableview->verticalHeader()->hide();
    3. //设置选中时为整行选中
    4. tableview->setSelectionBehavior(QAbstractItemView::SelectRows);
    5. //设置表格的单元为只读属性,即不能编辑
    6. tableview->setEditTriggers(QAbstractItemView::NoEditTriggers);
    7. //返回一个被选中的所有Item的索引,一般是去遍历这个链表进行处理
    8. [virtual protected] QModelIndexList QTableView::selectedIndexes() const

    7 QStandardItem被点选信号

    QStandardItemModel中的某个QStandardItem被点选后,QStandardItemModel对象会发出一个信号:

     
    
    1. void QAbstractItemView::clicked(const QModelIndex &index);
    2. /*
    3. *返回被点选的Item的索引
    4. */

    8 QItemDelegate代理

    QTableView在处理信息显示编辑的时候比较单调,类似行编辑器,为了获得更多的灵性性,交互通过QItemDelegate执行。

    ​ 下面通过派生一个SpinDelegate来实现一个整数旋转框的代理器。

    ​ 一般我们要重写函数createEditor:

     
    
    1. [virtual] QWidget *QItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    2. /*
    3. *QWidget *parent一般是指哪个窗口使用了这个代理,一般用来托管内存
    4. * QStyleOptionViewItem &option 样式风格
    5. * const QModelIndex &index 需要更改的Item索引
    6. */

    widget.h

     
    
    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. class QStandardItemModel;
    5. class Widget : public QTableView
    6. {
    7. Q_OBJECT
    8. public slots:
    9. void dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight,
    10. const QVector &roles = QVector ());
    11. public:
    12. Widget(QWidget *parent = );
    13. QStandardItemModel* model;
    14. ~Widget();
    15. };
    16. #endif

    widget.cpp

     
    
    1. #include "widget.h"
    2. #include "spindelegate.h"
    3. #include
    4. #include
    5. Widget::Widget(QWidget *parent)
    6. : QTableView(parent)
    7. {
    8. model = new QStandardItemModel(this);
    9. //设置列字段名
    10. model->setColumnCount();
    11. model->setHeaderData(,Qt::Horizontal,"姓名");
    12. model->setHeaderData(,Qt::Horizontal,"年龄");
    13. model->setHeaderData(,Qt::Horizontal,"性别");
    14. //设置行字段名
    15. model->setRowCount();
    16. model->setHeaderData(,Qt::Vertical, "记录一");
    17. model->setHeaderData(,Qt::Vertical, "记录二");
    18. model->setHeaderData(,Qt::Vertical, "记录三");
    19. //设置一条数据
    20. model->setItem(, , new QStandardItem("张三"));
    21. model->setItem(, , new QStandardItem(""));
    22. model->setItem(, , new QStandardItem("男"));
    23. this->setModel(model);
    24. //设置代理
    25. this->setItemDelegate(new SpinDelegate(this));
    26. connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector)),
    27. this,SLOT(dataChangedSlot(QModelIndex,QModelIndex,QVector)));
    28. this->setModel(model);
    29. }
    30. void Widget::dataChangedSlot(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles)
    31. {
    32. qDebug() << model->data(topLeft).toString() << endl;
    33. }
    34. Widget::~Widget()
    35. {
    36. }

    spinDelegate.h

     
    
    1. #ifndef SPINDELEGATE_H
    2. #define SPINDELEGATE_H
    3. #include
    4. class SpinDelegate : public QItemDelegate
    5. {
    6. public:
    7. SpinDelegate(QObject *parent = Q_NULLPTR);
    8. QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    9. };
    10. #endif // SPINDELEGATE_H

    spinDelegate.cpp

     
    
    1. #include "spindelegate.h"
    2. #include
    3. SpinDelegate::SpinDelegate(QObject *parent): QItemDelegate(parent)
    4. {
    5. }
    6. QWidget* SpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    7. const QModelIndex &index) const
    8. {
    9. if(index.column() == ) // 返回下拉框
    10. {
    11. QSpinBox* box = new QSpinBox(parent);
    12. box->setMinimum();
    13. box->setMaximum();
    14. return box;
    15. }
    16. return QItemDelegate::createEditor(parent, option, index);
    17. }
    18. 原文

  • 相关阅读:
    Alibaba最新发布的Spring Boot项目实战文档,Github标星78k
    C++ 【类和对象: 析构函数,拷贝构造函数,运算符重载 --2】
    23种设计模式之模板方法模式(Template Method Pattern)
    体态识别算法在 Android 端部署实例
    React 组件的3大属性: state
    链块串的实现(无功能函数实现)
    无约束优化算法
    WebRTC系列-SDP之setLocalDescription(1)
    hive解析json数据
    图论学习总结
  • 原文地址:https://blog.csdn.net/delphigbg/article/details/127896829