第8章:Delegate

1,QT视图/模型中的Delegate

2,源码:

#ifndef COMBODELEGATE_H
#define COMBODELEGATE_H

#include <QItemDelegate>
#include <QObject>
#include <QDateTimeEdit>
#include <QComboBox>

class ComboDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    ComboDelegate(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;

};

#endif // DATEDELEGATE_H
#include "combodelegate.h"

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

}

//完成创建控件的工作,创建由参数中的QModleIndex对象指定的表项数据的编辑控件,并对控件的内容进行限定
 QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     QComboBox *editor = new QComboBox(parent);

     editor->addItem(tr("工人"));
     editor->addItem(tr("农民"));
     editor->addItem(tr("医生"));
     editor->addItem(tr("律师"));
     editor->addItem(tr("军人"));
     editor->installEventFilter(const_cast<ComboDelegate *>(this));//调用QObject类的installEventFilter()函数安装事件过滤器,使ComboDelegate能够捕获QComboBox对象的事件

     return editor;
 }

 //设置控件显示的数据,将model中的数据更新至Delegate中,相当于一个初始化工作
 void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
 {
     QString dateStr = index.model()->data(index).toString();              //获取指定index数据项的数据,调用QModelIndex的model()函数可获得提供index的model对象
                                                                           //daa()函数返回的是一个QVariant对象,toString()函数将它转换成一个QString类型数据
     QComboBox *box = static_cast<QComboBox *>(editor);

     int i=box->findText(dateStr);
     box->setCurrentIndex(i);
 }


 //将Delegate中数据改变更新至Model中
 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);
 }
#ifndef DATEDELEGATE_H
#define DATEDELEGATE_H

#include <QItemDelegate>
#include <QObject>
#include <QDateTimeEdit>

class DateDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    DateDelegate(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;

};

#endif // DATEDELEGATE_H
#include "datedelegate.h"

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

}

//完成创建控件的工作,创建由参数中的QModleIndex对象指定的表项数据的编辑控件,并对控件的内容进行限定
 QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     QDateTimeEdit *editor = new QDateTimeEdit(parent);           //新建一个QDateTimeEdit对象作为编辑是的输入控件

     editor->setDisplayFormat("yyyy-MM-dd");                      //显示格式
     editor->setCalendarPopup(true);                              //设置日历选择的显示以Popup的方式,即下拉菜单的方式显示
     editor->installEventFilter(const_cast<DateDelegate *>(this));//调用QObject类的installEventFilter()函数安装事件过滤器,使DataDelegate能够捕获QDateTimeEdit对象的事件

     return editor;
 }

 //设置控件显示的数据,将model中的数据更新至Delegate中,相当于一个初始化工作
 void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
 {
     QString dateStr = index.model()->data(index).toString();              //获取指定index数据项的数据,调用QModelIndex的model()函数可获得提供index的model对象
                                                                           //daa()函数返回的是一个QVariant对象,toString()函数将它转换成一个QString类型数据
     QDate   date    = QDate::fromString(dateStr, Qt::ISODate);            //通过QDate的fromString函数将以QString类型表示的日期数据转换成QDate类型,

     QDateTimeEdit *edit = static_cast<QDateTimeEdit *>(editor);           //将editor转换为QDateTimeEdit对象,获得编辑控件的对象指针
     edit->setDate(date);                                                  //设置控件数据
 }


 //将Delegate中数据改变更新至Model中
 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)));            //调用setData函数将数据修改跟新到Model中
 }

 //更新控件区的显示内容
 void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     editor->setGeometry(option.rect);
 }
#include "mainwindow.h"
#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QFile>
#include <QTextStream>
#include "datedelegate.h"
#include "combodelegate.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();
    QStandardItemModel model(4, 4);

    QTableView         tableView;
    tableView.setModel(&model);

    DateDelegate       dateDelegate;
    tableView.setItemDelegateForColumn(1, &dateDelegate);

    ComboDelegate      comboDelegate;
    tableView.setItemDelegateForColumn(2, &comboDelegate);


    model.setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
    model.setHeaderData(1, Qt::Horizontal, QObject::tr("Birthday"));
    model.setHeaderData(2, Qt::Horizontal, QObject::tr("Job"));
    model.setHeaderData(3, Qt::Horizontal, QObject::tr("Income"));

    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.setMinimumSize(600, 400);
    tableView.show();

    return a.exec();
}

3,效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ksmtnsv37297/article/details/86621818
今日推荐