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

效果图

QT关于委托代理,数据模型的简单使用_第1张图片

代码

== 负有详细注释==

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(editor);
            int currentIndex = comboBox->findText(data.toString());
            comboBox->setCurrentIndex(currentIndex);
        }
        // 如果是“Gender”列,则将当前项的状态设置为QCheckBox的状态
        else if (index.column() == 2)
        {
            QCheckBox *checkBox = qobject_cast(editor);
            checkBox->setChecked(data.toBool());
        }
        // 否则,将当前项的文本设置为QLineEdit的文本
        else
        {
            QLineEdit *lineEdit = qobject_cast(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(editor);
            newData = comboBox->currentText();
        }
        else if (index.column() == 2)
        {
            QCheckBox *checkBox = qobject_cast(editor);
            newData = checkBox->isChecked();
            if(newData.toBool()){
                newData = "man";
            }else {
                newData = "woman";
            }
        }
        else
        {
            QLineEdit *lineEdit = qobject_cast(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();
}

你可能感兴趣的:(Qt,qt,开发语言)