首页 > 代码库 > 【Qt5开发及实例】25、实现代理的功能
【Qt5开发及实例】25、实现代理的功能
实现代理的功能
在Qt里面也有MVC,那就是视图,模型,代理,后面我们再开一章,好好来学习一下Qt的MVC吧!
main.cpp
/** * 书本:【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(); }
datedelegate.h
/** * 书本:【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
datedelegate.cpp
/** * 书本:【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); }
combodelegate.h
/** * 书本:【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
combodelegate.cpp
/** * 书本:【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); }
spindelegate.h
/** * 书本:【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
spindelegate.cpp
/** * 书本:【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 = http://www.mamicode.com/index.model()->data(index).toInt();>图形显示
【Qt5开发及实例】25、实现代理的功能
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。