QT关于委托代理,数据模型的简单使用

一些基本概念

1.数据模型:一般使用Qt的QAbstractItemModel作为基类,用于管理数据的存储和操作。它包括几个核心的函数:rowCount()、columnCount()、data()、setData()等。

2.视图:Qt中的视图主要有QTableView、QTreeView、QListView等,用于展示数据模型中的数据。

3.代理:代理用于在视图中修改数据的外观或行为,常用的代理有QItemDelegate、QStyledItemDelegate等。代理的主要函数有paint()、sizeHint()、createEditor()、setEditorData()、setModelData()等。

4.代理模型:代理模型是一种特殊的数据模型,它通过代理来修改数据的呈现方式,常用的代理模型有QSortFilterProxyModel、QIdentityProxyModel等。

5.委托模型:(QAbstractProxyModel)也是Qt中的一个模型类,它也用于在模型视图中进行数据转换和自定义呈现。与代理模型不同的是,委托模型可以对模型数据进行更复杂的转换和处理,例如将多个数据项合并为一个,或者将一个数据项拆分为多个。委托模型也可以用于在模型数据中添加虚拟行或列。

效果图

在这里插入图片描述

代码

== 负有详细注释==

#include <QApplication>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QTableView>
#include <QPainter>
#include <QLineEdit>
#include <QStandardItemModel>
#include <QComboBox>
#include <QCheckBox>
#include <QAbstractItemModel>

class CustomDelegate : public QStyledItemDelegate
{
public:
    CustomDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate(parent)
    {
    }

    // 重写paint()函数,实现自定义的绘制操作
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 获取单元格的值
        QVariant value = index.model()->data(index, Qt::DisplayRole);

        // 在单元格中绘制一个矩形和文本
        painter->save();
        painter->setRenderHint(QPainter::Antialiasing);
        painter->setPen(QPen(Qt::black));
        painter->setBrush(QBrush(Qt::white));
        painter->drawRect(option.rect.adjusted(1, 1, -1, -1));
        painter->drawText(option.rect, Qt::AlignCenter, value.toString());
        painter->restore();
    }

    // 重写createEditor()函数,实现自定义的编辑器创建操作
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 获取当前列的数据
        QVariant data = index.model()->data(index, Qt::DisplayRole);

        // 如果是“Age”列,则创建一个QComboBox对象作为编辑器,并设置其选项和默认值
        if (index.column() == 1)
        {
            QComboBox *comboBox = new QComboBox(parent);
            comboBox->addItems(QStringList() << "10" << "20" << "30" << "40");
            return comboBox;
        }
        // 如果是“Gender”列,则创建一个QCheckBox对象作为编辑器,并设置其状态
        else if (index.column() == 2)
        {
            QCheckBox *checkBox = new QCheckBox(parent);
            checkBox->setChecked(data.toBool());
            return checkBox;
        }
        // 否则,创建一个QLineEdit对象作为编辑器,并设置其文本
        else
        {
            QLineEdit *lineEdit = new QLineEdit(parent);
            lineEdit->setText(data.toString());
            return lineEdit;
        }
    }

    // 重写setEditorData()函数,实现自定义的编辑器数据设置操作
    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        // 获取当前列的数据
        QVariant  data = index.model()->data(index, Qt::DisplayRole);

        // 如果是“Age”列,则将当前项的文本设置为QComboBox的当前文本
        if (index.column() == 1)
        {
            QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
            int currentIndex = comboBox->findText(data.toString());
            comboBox->setCurrentIndex(currentIndex);
        }
        // 如果是“Gender”列,则将当前项的状态设置为QCheckBox的状态
        else if (index.column() == 2)
        {
            QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
            checkBox->setChecked(data.toBool());
        }
        // 否则,将当前项的文本设置为QLineEdit的文本
        else
        {
            QLineEdit *lineEdit = qobject_cast<QLineEdit *>(editor);
            lineEdit->setText(data.toString());
        }
    }

    // 重写setModelData()函数,实现自定义的编辑器数据提交操作
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        // 获取编辑器中的数据
        QVariant newData;
        if (index.column() == 1)
        {
            QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
            newData = comboBox->currentText();
        }
        else if (index.column() == 2)
        {
            QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
            newData = checkBox->isChecked();
            if(newData.toBool()){
                newData = "man";
            }else {
                newData = "woman";
            }
        }
        else
        {
            QLineEdit *lineEdit = qobject_cast<QLineEdit *>(editor);
            newData = lineEdit->text();
        }

        // 将数据保存到模型中
        model->setData(index, newData, Qt::EditRole);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建一个标准项模型,并设置其行数和列数
    QStandardItemModel model;
    model.setRowCount(4);
    model.setColumnCount(3);

    // 设置表头
    model.setHeaderData(0, Qt::Horizontal, QString("Name"));
    model.setHeaderData(1, Qt::Horizontal, QString("Age"));
    model.setHeaderData(2, Qt::Horizontal, QString("Gender"));

    // 向模型中添加数据
    model.setData(model.index(0, 0), "Alice");
    model.setData(model.index(1, 0), "Bob");
    model.setData(model.index(2, 0), "Charlie");
    model.setData(model.index(3, 0), "Dave");

    model.setData(model.index(0, 1), "20");
    model.setData(model.index(1, 1), "30");
    model.setData(model.index(2, 1), "20");
    model.setData(model.index(3, 1), "40");

    model.setData(model.index(0, 2), "man");
    model.setData(model.index(1, 2), "man");
    model.setData(model.index(2, 2), "man");
    model.setData(model.index(3, 2), "man");

    // 创建一个TableView,并设置模型和委托
    QTableView tableView;
    tableView.setModel(&model);

    CustomDelegate delegate;
    tableView.setItemDelegate(&delegate);

    // 允许编辑和排序
    tableView.setEditTriggers(QAbstractItemView::AllEditTriggers | QAbstractItemView::EditKeyPressed);
    tableView.setSortingEnabled(true);

    // 设置表格大小
    tableView.resize(400, 200);

    // 显示TableView
    tableView.show();

    return app.exec();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值