QT模型视图(代理QItemDelegate的使用)

程序

main.cpp(模型、视图的创建以及代理的连接)

main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QFile>
#include <QTextStream>
#include "datedelegate.h"
#include "combodelegate.h"
#include "spindelegate.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStandardItemModel model(4,4);
    QTableView tableView;
    tableView.setModel(&model);
    DateDelegate dateDelegate;
    tableView.setItemDelegateForColumn(1,&dateDelegate);//连接代理
    ComboDelegate comboDelegate;
    tableView.setItemDelegateForColumn(2,&comboDelegate);
    SpinDelegate spinDelegate;
    tableView.setItemDelegateForColumn(3,&spinDelegate);
    model.setHeaderData(0,Qt::Horizontal,QObject::tr("姓名"));
    model.setHeaderData(1,Qt::Horizontal,QObject::tr("生日"));
    model.setHeaderData(2,Qt::Horizontal,QObject::tr("职业"));
    model.setHeaderData(3,Qt::Horizontal,QObject::tr("收入"));
    QFile file("test.txt");
    if(file.open(QFile::ReadOnly|QFile::Text))
    {
        QTextStream stream(&file);
        QString line;
        model.removeRows(0,model.rowCount(QModelIndex()),QModelIndex());
        int row=0;
        do
        {
            line=stream.readLine();
            if(!line.isEmpty())
            {
                model.insertRows(row,1,QModelIndex());
                QStringList pieces =line.split(",",QString::SkipEmptyParts);
                model.setData(model.index(row,0,QModelIndex()),pieces.value(0));
                model.setData(model.index(row,1,QModelIndex()),pieces.value(1));
                model.setData(model.index(row,2,QModelIndex()),pieces.value(2));
                model.setData(model.index(row,3,QModelIndex()),pieces.value(3));
                row++;
            }
        }while(!line.isEmpty());
        file.close();
    }
    tableView.setWindowTitle("Delegate");
    tableView.resize(450,200);
    tableView.show();

    //MainWindow w;
    //w.show();

    return a.exec();
}

三个代理函数的创建(都继承QItemDelegate类)

DateDelegate函数(QDateTimeEdit类)

.h
#ifndef DATEDELEGATE_H
#define DATEDELEGATE_H
#include <QItemDelegate>


class DateDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    DateDelegate(QObject *parent=0);
    //在QModelIndex处创建一个控件
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    //初始化控件中的数据
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    //将Delegate中对数据的改变更新至model中
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    //更新控件区的显示,使代理控件能够显示在对应索引的数据上
    void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const;
};

#endif // DATEDELEGATE_H

.cpp
#include "datedelegate.h"
#include <QDateTimeEdit>

DateDelegate::DateDelegate(QObject*parent):QItemDelegate(parent)
{

}

QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QDateTimeEdit *editor =new QDateTimeEdit(parent);
    editor->setDisplayFormat("yyyy-MM--dd");
    editor->setCalendarPopup(true);//设置日历的显示已下拉菜单显示
    editor->installEventFilter(const_cast<DateDelegate*>(this));//设置过滤器使DateDelegate能够捕获QDateTimeEdit对象的事件
    return editor;
}

void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString dateStr = index.model()->data(index).toString();
    QDate date=QDate::fromString(dateStr,Qt::ISODate);
    QDateTimeEdit *edit=static_cast<QDateTimeEdit*>(editor);//通过紧缩转换获得编辑控件的对象指针
    edit->setDate(date);
}

void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QDateTimeEdit *edit=static_cast<QDateTimeEdit*>(editor);//通过紧缩转换获得编辑控件的对象指针
    QDate date=edit->date();
    model->setData(index,QVariant(date.toString(Qt::ISODate)));
}

void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

ComboDelegate函数(QComboBox类)

.h
#ifndef COMBODELEGATE_H
#define COMBODELEGATE_H
#include <QItemDelegate>
class ComboDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    ComboDelegate(QObject*parent=0);
    //在QModelIndex处创建一个控件
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    //初始化控件中的数据
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    //将Delegate中对数据的改变更新至model中
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    //更新控件区的显示,使代理控件能够显示在对应索引的数据上
    void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const;
};

#endif // COMBODELEGATE_H

.cpp
#include "combodelegate.h"
#include <QComboBox>

ComboDelegate::ComboDelegate(QObject*parent):QItemDelegate(parent)
{

}

QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QComboBox *editor=new QComboBox(parent);
    editor->addItem("工人");
    editor->addItem("农民");
    editor->addItem("医生");
    editor->addItem("律师");
    editor->addItem("军人");
    editor->installEventFilter(const_cast<ComboDelegate*>(this));
    return editor;
}

void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString str=index.model()->data(index).toString();
    QComboBox* box=static_cast<QComboBox*>(editor);
    int i=box->findText(str);
    box->setCurrentIndex(i);
}

void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox *box=static_cast<QComboBox*>(editor);
    QString str=box->currentText();
    model->setData(index,str);
}

void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

SpinDelegate函数(QSpinBox类)

.h
#ifndef SPINDELEGATE_H
#define SPINDELEGATE_H
#include<QItemDelegate>

class SpinDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    SpinDelegate(QObject*parent=0);
    //在QModelIndex处创建一个控件
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    //初始化控件中的数据
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    //将Delegate中对数据的改变更新至model中
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    //更新控件区的显示,使代理控件能够显示在对应索引的数据上
    void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const;
};

#endif // SPINDELEGATE_H

.cpp
#include "spindelegate.h"
#include <QSpinBox>

SpinDelegate::SpinDelegate(QObject*parent):QItemDelegate(parent)
{

}

QWidget *SpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSpinBox *editor =new QSpinBox(parent);
    editor->setRange(0,10000);
    editor->installEventFilter(const_cast<SpinDelegate*>(this));
    return editor;
}

void SpinDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value=index.model()->data(index).toInt();
    QSpinBox *box=static_cast<QSpinBox*>(editor);
    box->setValue(value);
}

void SpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QSpinBox *box=static_cast<QSpinBox*>(editor);
    int value=box->value();
    model->setData(index,value);
}

void SpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

效果展示

在这里插入图片描述

发布了31 篇原创文章 · 获赞 3 · 访问量 276

猜你喜欢

转载自blog.csdn.net/weixin_44011306/article/details/105566854