Qt | QTableView的使用方法


QTableView的数据是基于model显示的,需要先建一个model,然后tableView通过setModel进行模型绑定,后续操作model就可以实现表格数据的读写。


1、基础使用

1、设置模型显示

        # 创建3X3模型,如果不指定表格大小,那么他会根据标签的数量自行定义表格大小
        model = QStandardItemModel(3, 3, self.__MainWindow)
        # 设置行标签
        model.setHorizontalHeaderLabels(['编号', '姓名', '年龄'])
        # 设置列标签
        model.setVerticalHeaderLabels(['一班', '二班', '三班'])
        # 设置模型到TabelView上
        self.tableView.setModel(model)

在这里插入图片描述

2、设置内容显示

        data = ['1', '2', '3']
        for i in range(len(data)):
            item = QStandardItem(data[i])
            # 设置内容对齐方式为:水平中心对齐+垂直中心对齐
            item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            model.setItem(i, i, item)

在这里插入图片描述

3、获取表格内容

QString data = model->data(model->index(0, 0)).toString();  // 获取第[0,0]格的数据

4、设置表格之间根据间距调整宽度方式

一共5种显示模式:

  • Custom
  • Fixed
  • Interactive
  • ResizeToContents
  • Stretch

常用的是根据内容自动调整大小和拉伸

设置方法:

# 设置水平标签重载大小模式为拉伸,也就是铺满整个框,每一列间距是一样的,这样比较好看
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

5、隐藏标题栏

tableView->verticalHeader()->hide();

2、表格设置成下拉框形式

QTableView的表格默认显示的是ItemDelegate,双击表格的时候可以实现编辑,如果想要实现双机表格出现一个下拉框,那么就需要将Delegate设置为QComboBox,实现办法是自定义继承自QItemDelegate的ComboDelegate,覆写updateEditorGeometry、setModelData、setEditorData、createEditor这四个函数即可。代码如下:

头文件:

#ifndef COMBODELEGATE_H
#define COMBODELEGATE_H

#include <QItemDelegate>

class ComboDelegate : public QItemDelegate
{
    Q_OBJECT

public:

    ComboDelegate() = delete;
    virtual ~ComboDelegate();
    ComboDelegate(const QStringList &items, QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor,  const QStyleOptionViewItem &option, const QModelIndex &index) const;

signals:
    void currentIndexChange(int row, int col) const;  //定义消息必须有const

private slots :

private:
    QStringList items;
};

#endif // COMBODELEGATE_H

源文件:

#include "ComboDelegate.h"
#include <QtWidgets/QComboBox>
#include <QDebug>

ComboDelegate::ComboDelegate(const QStringList &items, QObject *parent) : QItemDelegate(parent)
{
    this->items = items;
}

ComboDelegate::~ComboDelegate()
{

}

QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
{
    QComboBox *editor = new QComboBox(parent);
    editor->addItems(items);
    editor->setEditable(false);  // 不可编辑
    return editor;
}

void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    int currIndex = comboBox->findText(value);
    comboBox->setCurrentIndex(currIndex);
}

void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    QString value = comboBox->currentText();
    model->setData(index, value, Qt::EditRole);
    emit currentIndexChange(index.row(), index.column());   // 发送信号,实现其它联动更新
}

void ComboDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    (void)index;  // 防止编译警告
    editor->setGeometry(option.rect);
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->showPopup(); // 直接弹出下拉框,没有这一句双击后需要再点一次Combox才会弹出下拉框
}

使用方法:

    QStringList sensorTypes;
    sensorTypes << ""
                << "颗粒物"
                << "火灾"
                << "烟感"
                << "水浸"
                << "温度"
                << "湿度"
                << "温湿度"
                << "自定义1"
                << "自定义2"
                << "自定义3"
                << "自定义4"
                << "自定义5"
                << "自定义6"
                << "自定义7"
                << "自定义8"
                << "自定义9"
                << "自定义10";

    ComboDelegate* delegateSensorTypes = new ComboDelegate(sensorTypes, this);
    ui->tableView->setItemDelegateForColumn(0, delegateSensorTypes);  // 第0列表格设置为下拉框形式

效果图:


ends…

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐