Qt61 视图中的委托1

学习自唐佐林老师的Qt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SubStyledItemDelegate.h

#ifndef SUBSTYLEDITEMDELEGATE_H
#define SUBSTYLEDITEMDELEGATE_H
#include <QStyledItemDelegate>
//自定义委托类,需要重写成员函数
class SubStyledItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
protected slots:
    //关闭编辑器组件槽
    void onCloseEditor(QWidget* editor);
    //新数据提交槽
    void onCommitData(QWidget* editor);
public:
    explicit SubStyledItemDelegate(QObject* parent = 0);
    //创建编辑器组件
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    //更新编辑器组件大小
    void updateEditorGeometry(QWidget *editor, 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;
};
#endif // SUBSTYLEDITEMDELEGATE_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QTableView>
#include <QStandardItemModel>
#include <QPushButton>
#include "SubStyledItemDelegate.h"
class Widget : public QWidget
{
    Q_OBJECT
    
    QTableView m_view;
    QStandardItemModel m_model;
    QPushButton m_testBtn;
    SubStyledItemDelegate m_delegate;//创建自定义委托类对象
    void initView();
    void initModel();
private slots:
    void onTestBtnClicked();
public:
    Widget(QWidget* parent = 0);
    ~Widget();
};
#endif // WIDGET_H

Widget.cpp

#include "Widget.h"
#include <QModelIndex>
#include <QDebug>
Widget::Widget(QWidget* parent) : QWidget(parent)
{
    initView();
    initModel();
    m_view.setModel(&m_model);
    m_testBtn.setParent(this);
    m_testBtn.move(10, 120);
    m_testBtn.resize(300, 30);
    m_testBtn.setText("Test");
    connect(&m_testBtn, SIGNAL(clicked()), this, SLOT(onTestBtnClicked()));
}
void Widget::initView()
{
    m_view.setParent(this);
    m_view.move(10, 10);
    m_view.resize(300, 100);
    //将委托类对象设置到视图中
    m_view.setItemDelegate(&m_delegate);
}
void Widget::initModel()
{
    QStandardItem* root = m_model.invisibleRootItem();
    QStandardItem* itemA = new QStandardItem();
    QStandardItem* itemB = new QStandardItem();
    QStandardItem* itemC = new QStandardItem();
    QStandardItem* itemD = new QStandardItem();
    itemA->setData("A", Qt::DisplayRole);
    itemB->setData("B", Qt::DisplayRole);
    itemC->setData("C", Qt::DisplayRole);
    itemD->setData("D", Qt::DisplayRole);
    root->setChild(0, 0, itemA);
    root->setChild(0, 1, itemB);
    root->setChild(1, 0, itemC);
    root->setChild(1, 1, itemD);
}
void Widget::onTestBtnClicked()
{
    qDebug() << "Model Data:";
    for(int i=0; i<m_model.rowCount(); i++)
    {
        qDebug() << "Row: " << i;
        for(int j=0; j<m_model.columnCount(); j++)
        {
            QModelIndex index = m_model.index(i, j, QModelIndex());
            QString text = index.data(Qt::DisplayRole).toString();
            qDebug() << text;
        }
        qDebug() << endl;
    }
    //查看委托类是哪个
    qDebug() << "Current View Delegate: " << m_view.itemDelegate();
}
Widget::~Widget()
{
    
}

SubStyledItemDelegate.cpp

#include "SubStyledItemDelegate.h"
#include <QDebug>
SubStyledItemDelegate::SubStyledItemDelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
    connect(this, SIGNAL(closeEditor(QWidget*)), this, SLOT(onCloseEditor(QWidget*)));
    connect(this, SIGNAL(commitData(QWidget*)), this, SLOT(onCommitData(QWidget*)));
}
//创建编辑器组件
QWidget* SubStyledItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    qDebug() << "SubStyledItemDelegate::createEditor";
    //直接调用父类委托类成员函数 QQStyledItemDelegate::createEditor
    return QStyledItemDelegate::createEditor(parent, option, index);
}
void SubStyledItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    qDebug() << "SubStyledItemDelegate::updateEditorGeometry";
    //直接调用父类委托类成员函数 QStyledItemDelegate::updateEditorGeometry
    QStyledItemDelegate::updateEditorGeometry(editor, option, index);
}
void SubStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    qDebug() << "SubStyledItemDelegate::setEditorData";
    QStyledItemDelegate::setEditorData(editor, index);
}
void SubStyledItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    qDebug() << "SubStyledItemDelegate::setModelData";
    return QStyledItemDelegate::setModelData(editor, model, index);
}
void SubStyledItemDelegate::onCloseEditor(QWidget* editor)
{
    qDebug() << "SubStyledItemDelegate::onCloseEditor";
}
void SubStyledItemDelegate::onCommitData(QWidget* editor)
{
    qDebug() << "SubStyledItemDelegate::onCommitData";
}

main.cpp

#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

在这里插入图片描述
注意:一次委托的过程 如下

首先创建编辑器
然后改变编辑器大小,使得编辑器大小和数据项大小一致
之后开始设置编辑器中数据
点击回车后提交数据
将数据提交到模型
模型将新数据再次返回到编辑器中
最后关闭编辑器

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/116426086
61