在Qt里面也有MVC,那就是视图,模型,代理,后面我们再开一章,好好来学习一下Qt的MVC吧!
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:main.cpp * 时间:2015年1月29日20:53:04 * 作者:cutter_point */ #include <QApplication> #include <QStandardItemModel> #include <QTableView> //#include <QFileDialog> #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; ComboDelegate comboDelegate; spindelegate spinDelegate; tableView.setItemDelegateForColumn(1, &dateDelegate); //第二列设定代理 tableView.setItemDelegateForColumn(2, &comboDelegate); 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("收入")); //第一列 // QString path = QFileDialog::getOpenFileName(tableView, "Open", ".", "file(*.txt)"); QFile file("F:/QTcode/zhangjie8/CH803/test.txt"); // 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()); //为当前这个索引插入一行,1个数据 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(QObject::tr("Delegate")); tableView.show(); return a.exec(); }
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:spindelegate.h * 时间:2015年1月30日17:48:38 * 作者:cutter_point */ #ifndef SPINDELEGATE_H #define SPINDELEGATE_H #include <QItemDelegate> class spindelegate : public QItemDelegate { Q_OBJECT public: explicit spindelegate(QObject *parent = 0); signals: public slots: // QAbstractItemDelegate interface public: 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 // SPINDELEGATE_H
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:main.cpp * 时间:2015年1月30日16:49:58 * 作者:cutter_point */ #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)); //调用这个函数安装事件过滤器,使这个对象可以捕获QDateTimeEdit对象的事件 return editor; } //这个是初始化作用,初始化代理控件的数据 void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { //先用这个index返回这个model然后用这个model得到index对应的数据 QString dateStr = index.model()->data(index).toString(); QDate date = QDate::fromString(dateStr, Qt::ISODate); //根据QString类型得到相应的时间类型 QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor); //强转为QDateTimeEdit*类型 edit->setDate(date); //设置代理控件的显示数据 } //将代理控件里面的数据更新到视图控件中 //void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; 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))); //把值放到相应的index里面 } //代理中数据的改变放到model中 //void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); }
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:combodelegate.h * 时间:2015年1月30日17:48:38 * 作者:cutter_point */ #ifndef COMBODELEGATE_H #define COMBODELEGATE_H #include <QItemDelegate> class ComboDelegate : public QItemDelegate { Q_OBJECT public: explicit ComboDelegate(QObject *parent = 0); signals: public slots: // QAbstractItemDelegate interface public: //这里同datedelegate.h里面的意思 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 // COMBODELEGATE_H
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:main.cpp * 时间:2015年1月30日16:49:58 * 作者:cutter_point */ #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)); //调用这个函数安装事件过滤器,使这个对象可以捕获QDateTimeEdit对象的事件 return editor; } //这个是初始化作用,初始化代理控件的数据 void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { //先用这个index返回这个model然后用这个model得到index对应的数据 QString dateStr = index.model()->data(index).toString(); QDate date = QDate::fromString(dateStr, Qt::ISODate); //根据QString类型得到相应的时间类型 QDateTimeEdit *edit = static_cast<QDateTimeEdit*>(editor); //强转为QDateTimeEdit*类型 edit->setDate(date); //设置代理控件的显示数据 } //将代理控件里面的数据更新到视图控件中 //void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; 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))); //把值放到相应的index里面 } //代理中数据的改变放到model中 //void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); }
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:spindelegate.h * 时间:2015年1月30日17:48:38 * 作者:cutter_point */ #ifndef SPINDELEGATE_H #define SPINDELEGATE_H #include <QItemDelegate> class spindelegate : public QItemDelegate { Q_OBJECT public: explicit spindelegate(QObject *parent = 0); signals: public slots: // QAbstractItemDelegate interface public: 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 // SPINDELEGATE_H
/** * 书本:【Qt5开发及实例】 * 功能:实现代理的功能 * 文件:spindelegate.cpp * 时间:2015年1月30日17:48:38 * 作者:cutter_point */ #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, 30000); editor->installEventFilter(const_cast<QSpinBox*>(editor)); 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); }
原文地址:http://blog.csdn.net/cutter_point/article/details/43310079