首页 > 代码库 > 【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、实现代理的功能