利用Delegate设计表格中控件。
实现步骤如下。
(1)首先,加载表格数据,以便后面的操作。源文件“main.cpp”中的具体代码如下:

#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QFile>
#include <QTextStream>
int main(int argc,char *argv[])
{QApplication a(argc,argv);QStandardItemModel model(4,4);QTableView tableView;tableView.setModel(&model);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("收入"));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.setWindowTitle(QObject::tr("Delegate"));tableView.show();return app.exec();
}

(2)选择“构建”→“构建项目"DateDelegate"”菜单项,首先按照如下图所示的格式编辑本例所用的数据文件“test.txt”,保存在项目build-DateDelegate- Desktop_Qt_5_9_0_MinGW_32bit-Debug目录下。

然后运行程序,效果如图所示:

(3)在上图中,使用手动的方式实现对生日的录入编辑。下面使用日历编辑框QDateTimeEdit 控件实现对生日的编辑,用自定义的Delegate来实现。
(4)DateDelegate 继承自QItemDelegate类。头文件“datedelegate.h”中的具体代码如下:

#include <QItemDelegate>
class DateDelegate : public QItemDelegate
{Q_OBJECT
public:DateDelegate(QObject *parent = 0);QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem & option, const QModelIndex &index) const;          //完成创建控件的工作,创建由参数中的QModelIndex对象指定的表项数据的编辑控件,并对控件的内容进行限定。void setEditorData(QWidget *editor, const QModelIndex &index) const; //设置控件显示的数据,将Model中的数据更新至Delegate中,相当于一个初始化工作。void setModelData(QWidget *editor, QAbstractItemModel *model, const QModel Index &index) const;                 //将Delegate中对数据的改变更新至Model中void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem & option, const QModelIndex &index) const;         //更新控件区的显示
};

(5)源文件“datedelegate.cpp”中的具体代码如下:

#include "datedelegate.h"
#include <QDateTimeEdit>
DateDelegate::DateDelegate(QObject *parent):QItemDelegate(parent)
{}

createEditor()函数的具体实现代码如下:

QWidget *DateDelegate::createEditor(QWidget *parent,const QStyleOptionView Item &/*option*/,const QModelIndex &/*index*/) const
{QDateTimeEdit *editor = new QDateTimeEdit(parent);        //新建一个QDateTimeEdit对象作为编辑时的输入控件。editor->setDisplayFormat("yyyy-MM-dd");            //设置该QDateTimeEdit对象的显示格式为yyyy-MM-dd,此为ISO标准显示方式。editor->setCalendarPopup(true);              //设置日历选择的显示以Popup的方式,即下拉菜单方式显示。editor->installEventFilter(const_cast<DateDelegate*>(this));     //调用QObject类的installEvent Filter()函数安装事件过滤器,使DateDelegate能够捕获QDateTimeEdit对象的事件。return editor;
}

setEditorData()函数的具体代码如下:

void DateDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{QString dateStr= index.model()->data(index).toString();    //获取指定index数据项的数据。调用QModelIndex的model()函数可获得提供index的Model对象,data()函数返回的是一个QVariant对象,toString()函数将它转换为一个QString类型数据。QDate date = QDate::fromString(dateStr,Qt::ISODate); //通过QDate的fromString()函数将以QString类型表示的日期数据转换为QDate类型。Qt::ISODate表示QDate类型的日期是以ISO格式保存的,这样最终转换获得的QDate数据也是ISO格式,使控件显示与表格显示保持一致。QDateTimeEdit *edit=static_cast<QDateTimeEdit*>(editor);//将editor转换为QDateTimeEdit对象,以获得编辑控件的对象指针。edit->setDate(date);              //设置控件的显示数据
}

setModelData()函数的具体代码如下:

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中。
}

updateEditorGeometry()函数的具体代码如下:

void DateDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const
{editor->setGeometry(option.rect);
}

(6)在“main.cpp”文件中添加如下代码:

 #include "datedelegate.h"

在语句tableView.setModel(&model);后面添加如下代码:

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

(7)此时运行程序,双击第1行第2列,将显示如下图所示的日历编辑框控件。

下面使用下拉列表框QComboBox控件实现对职业类型的输入编辑,使用自定义的Delegate实现。
(1)ComboDelegate继承自QItemDelegate类。
头文件“combodelegate.h”中的具体代码如下:

#include <QItemDelegate>
class ComboDelegate : public QItemDelegate
{Q_OBJECT
public:ComboDelegate(QObject *parent = 0);QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,constQModelIndex    &index) const;void setEditorData(QWidget *editor, const QModelIndex &index) const;void setModelData(QWidget *editor, QAbstractItemModel *model, const QModel Index &index) const;void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const  QModelIndex &index) const;
};

(2)源文件“combodelegate.cpp”中的具体代码如下:

#include "combodelegate.h"
#include <QComboBox>
ComboDelegate::ComboDelegate(QObject *parent):QItemDelegate(parent)
{}

createEditor()函数中创建了一个QComboBox控件,并插入可显示的条目,安装事件过滤器。具体代码如下:

QWidget *ComboDelegate::createEditor(QWidget *parent,const QStyleOptionView  Item &/*option*/,const QModelIndex &/*index*/) const
{QComboBox *editor = new QComboBox(parent);editor->addItem("工人");editor->addItem("农民");editor->addItem("医生");editor->addItem("律师");editor->addItem("军人");editor->installEventFilter(const_cast<ComboDelegate*>(this));return editor;
}

setEditorData()函数中更新了Delegate控件中的数据显示,具体代码如下:

void ComboDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{QString str =index.model()->data(index).toString();QComboBox *box = static_cast<QComboBox*>(editor);int i=box->findText(str);box->setCurrentIndex(i);
}

setModelData()函数中更新了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);
}

updateEditorGeometry()函数的具体代码如下:

void ComboDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
{editor->setGeometry(option.rect);
}

在“main.cpp”文件中添加以下内容:

 #include "combodelegate.h"

在语句tableView.setModel(&model)的后面添加以下代码:

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

此时运行程序,双击第1行第3列,显示如图所示的下拉列表:

下面使用QSpinBox控件实现对收入的输入编辑,调用自定义的Delegate来实现。
SpinDelegate类的实现与ComboDelegate类的实现类似。
(1)头文件“spindelegate.h”中的具体代码如下:

#include <QItemDelegate>
class SpinDelegate : public QItemDelegate
{Q_OBJECT
public:SpinDelegate(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 QModel Index &index) const;void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

(2)源文件“spindelegate.cpp”中的具体代码如下:

#include "spindelegate.h"
#include <QSpinBox>
SpinDelegate::SpinDelegate(QObject *parent): QItemDelegate(parent)
{}

createEditor()函数的具体实现代码如下:

QWidget *SpinDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &/*option*/,const QModelIndex &/*index*/) const
{QSpinBox *editor = new QSpinBox(parent);editor->setRange(0,10000);editor->installEventFilter(const_cast<SpinDelegate*>(this));return editor;
}

setEditorData()函数的具体实现代码如下:

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);
}

setModelData()函数的具体实现代码如下:

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);
}

updateEditorGeometry()函数的具体实现代码如下:

void SpinDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
{editor->setGeometry(option.rect);
}

(3)在“main.cpp”文件中添加代码如下:

  #include "spindelegate.h"

在语句tableView.setModel(&model)的后面添加内容如下:

SpinDelegate spinDelegate;
tableView.setItemDelegateForColumn(3,&spinDelegate);

(4)此时运行程序,双击第1行第4列后的效果如下图所示。

QT学习:代理(Delegate)练习相关推荐

  1. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  2. Qt学习之路_12(简易数据管理系统)

    原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...

  3. QT学习之路2 学习笔记

    QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...

  4. 《Qt 学习之路 2》

    Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...

  5. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

  6. Qt学习笔记,Qt程序架构设计要旨

    Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...

  7. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  8. 对QT学习之路12-14的源代码补充与修正

    QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...

  9. Qt学习笔记之MySQL数据库

    一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

  10. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

最新文章

  1. 不用深度学习,怎么提取图像特征?
  2. 模型剪枝(Pruning)
  3. vtigercrm学习(二)
  4. python展开面_python面度对象(属性,类方法,静态方法)
  5. java linux 串口_Linux Java 串口通信 | 学步园
  6. Linux工作笔记-重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usi
  7. 总结:request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别
  8. 你还在用HTTP吗?HTTP/3都来了。。。
  9. js 和 jquery 动态创建元素
  10. 体验vSphere 6之2-vCenter 6
  11. 常用制图工具Visio-ProcessOn
  12. 莫言瑞典演讲《讲故事的人》
  13. imx8qm HDMI-TX调试
  14. 机器学习种9种常用算法
  15. 解决:如何利用ssh命令,免密登录远程服务器
  16. PCB板载天线及PCB设计要点
  17. 中国“神威•太湖之光”蝉联世界超算冠军
  18. Vuex的基本使用及总结(超详细)
  19. 图像分类经典卷积神经网络—ResNet论文翻译(中英文对照版)—Deep Residual Learning for Image Recognition(深度残差学习的图像识别)
  20. 排序算法——十大排序算法总结与对比

热门文章

  1. 严选前端全栈工程师学习笔记
  2. CCF-百度松果基金闭门研讨会成功举办,百度飞桨提供基金平台支持
  3. 蓝桥备赛第二周 前缀和
  4. Easy Multiplication 快速傅里叶变换
  5. 二分法求解一元多次方程
  6. Linux系统安装python3和创建python3虚拟环境
  7. python控制51单片机的红绿灯_基于51单片机的红绿灯实现(使用普中科技开发板)...
  8. python中list是什么意思_python中list和list [:]有什么区别?
  9. 【Linux环境】SSH突然无法连接【排查2个小时最终解决Failed to start OpenSSH server daemon】及【阿里云服务器的 kdevtmpfsi 挖矿病毒处理】
  10. Java 调用接口工具类并设置请求和传输超时时间