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,效果: