trackeEditorDelegate例子是《 C++ GUI Programming with Qt 4》中自定义委托的标准例子。

和上一个SpinBox例子相比更完整:它多了自定义Editor、重载Paint()函数、提交数据信号commitData()、关闭控件信号closeEditor()

附件中有源码可以下载。

Main.cpp

#include <QApplication>#include "trackeditor.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);QList<Track> tracks;tracks << Track("The Flying Dutchman: Overture", 630)<< Track("The Flying Dutchman: Wie aus der Fern laengst ""vergangner Zeiten", 374)<< Track("The Flying Dutchman: Steuermann, lass die Wacht",152)<< Track("Die Walkuere: Ride of the Valkyries", 286)<< Track("Tannhaeuser: Freudig begruessen wir die edle ""Halle", 384)<< Track("Tannhaeuser: Wie Todesahnung - O du mein holder ""Abendstern", 257)<< Track("Lohengrin: Treulich gefuert ziehet dahnin", 294)<< Track("Lohengrin: In fernem Land", 383)<< Track("Die Meistersinger von Nuernberg: Overture", 543)<< Track("Die Meistersinger von Nuernberg: Verachtet mir ""die Meister nicht", 200)<< Track("Die Meistersinger von Nuernberg: Ehrt eure ""deutschen Meister", 112)<< Track("Goetterdaemmerung: Funeral Music", 469)<< Track("Tristan und Isolde: Mild und leise, wie er ""laechelt", 375);//自定义编辑控件TrackEditor editor(&tracks);editor.resize(600, 300);editor.show();return app.exec();
}

TrackEditor.h

#ifndef TRACKEDITOR_H
#define TRACKEDITOR_H#include <QDialog>
#include <QList>class QDialogButtonBox;
class QTableWidget;class Track
{
public:Track(const QString &title = "", int duration = 0);QString title;int duration;
};class TrackEditor : public QDialog
{Q_OBJECTpublic:TrackEditor(QList<Track> *tracks, QWidget *parent = 0);void done(int result);private slots:void addTrack();private:QTableWidget *tableWidget;QDialogButtonBox *buttonBox;QList<Track> *tracks;
};#endif

TrackEditor.cpp

#include <QtGui>#include "trackdelegate.h"
#include "trackeditor.h"Track::Track(const QString &title, int duration)
{this->title = title;this->duration = duration;
}TrackEditor::TrackEditor(QList<Track> *tracks, QWidget *parent): QDialog(parent)
{this->tracks = tracks;//视图控件tableWidget = new QTableWidget(tracks->count(), 2);//设置委托tableWidget->setItemDelegate(new TrackDelegate(1));//设置视图列头tableWidget->setHorizontalHeaderLabels(QStringList() << tr("Track") << tr("Duration"));//初始化视图内容for (int row = 0; row < tracks->count(); ++row) {Track track = tracks->at(row);QTableWidgetItem *item0 = new QTableWidgetItem(track.title);//设置第0列中所有项tableWidget->setItem(row, 0, item0);QTableWidgetItem *item1= new QTableWidgetItem(QString::number(track.duration));item1->setTextAlignment(Qt::AlignRight);//设置第1列所有项tableWidget->setItem(row, 1, item1);}//根据委托的SizeHint,重新设置视图大小tableWidget->resizeColumnToContents(0);buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel);QPushButton *addTrackButton = buttonBox->addButton(tr("&Add Track"),QDialogButtonBox::ActionRole);connect(addTrackButton, SIGNAL(clicked()), this, SLOT(addTrack()));connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->addWidget(tableWidget);mainLayout->addWidget(buttonBox);setLayout(mainLayout);setWindowTitle(tr("Track Editor"));
}void TrackEditor::done(int result)
{//okif (result == QDialog::Accepted) {tracks->clear();for (int row = 0; row < tableWidget->rowCount(); ++row) {QString title = tableWidget->item(row, 0)->text();QTableWidgetItem *item = tableWidget->item(row, 1);int duration = item ? item->text().toInt() : 0;tracks->append(Track(title, duration));}}QDialog::done(result);
}void TrackEditor::addTrack()
{//在最后新插入一行tableWidget->insertRow(tableWidget->rowCount());
}

TrackDelegate.h

#ifndef TRACKDELEGATE_H
#define TRACKDELEGATE_H#include <QItemDelegate>class TrackDelegate : public QItemDelegate
{Q_OBJECTpublic:TrackDelegate(int durationColumn, QObject *parent = 0);//重新绘制void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const;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;private slots:void commitAndCloseEditor();private:int durationColumn;
};#endif

TrackDelegate.cpp

#include <QtGui>#include "trackdelegate.h"TrackDelegate::TrackDelegate(int durationColumn, QObject *parent): QItemDelegate(parent)
{this->durationColumn = durationColumn;
}void TrackDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,const QModelIndex &index) const
{//保存音轨的列if (index.column() == durationColumn) {//获得索引对应Model中的数据int secs = index.model()->data(index, Qt::DisplayRole).toInt();//设置时间格式字符串 分:秒QString text = QString("%1:%2").arg(secs / 60, 2, 10, QChar('0')).arg(secs % 60, 2, 10, QChar('0'));//获取项风格设置QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;//绘制文本drawDisplay(painter, myOption, myOption.rect, text);//如果当前有焦点,就绘制一个焦点矩形,否则什么都不做drawFocus(painter, myOption, myOption.rect);} else{//否则默认QItemDelegate::paint(painter, option, index);}
}QWidget *TrackDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const
{//音轨时间列if (index.column() == durationColumn) {//时间编辑控件QTimeEdit *timeEdit = new QTimeEdit(parent);//时间编辑控件文本格式timeEdit->setDisplayFormat("mm:ss");//如果编辑结束,激活提交和关闭槽connect(timeEdit, SIGNAL(editingFinished()),this, SLOT(commitAndCloseEditor()));return timeEdit;} else {//否则使用默认委托处理return QItemDelegate::createEditor(parent, option, index);}
}
//设置控件值
void TrackDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{//音轨时间列if (index.column() == durationColumn) {//获得当前索引在Model中的值int secs = index.model()->data(index, Qt::DisplayRole).toInt();//设置时间控件的值QTimeEdit *timeEdit = qobject_cast<QTimeEdit *>(editor);timeEdit->setTime(QTime(0, secs / 60, secs % 60));} else {QItemDelegate::setEditorData(editor, index);}
}
//设置Model值
void TrackDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const
{//音轨列if (index.column() == durationColumn) {//获得时间控件值QTimeEdit *timeEdit = qobject_cast<QTimeEdit *>(editor);QTime time = timeEdit->time();int secs = (time.minute() * 60) + time.second();//设置模型值model->setData(index, secs);} else {//否则使用默认委托处理QItemDelegate::setModelData(editor, model, index);}
}
//自定义 提交和关闭 槽函数
void TrackDelegate::commitAndCloseEditor()
{QTimeEdit *editor = qobject_cast<QTimeEdit *>(sender());//提交该控件的值 否则模型中数据不更改emit commitData(editor);//关闭该控件 可以告知委托去代开下一个控件emit closeEditor(editor);
}

基于QItemDelegate的例子2 trackeEditorDelegate相关推荐

  1. 基于QItemDelegate的例子1 SpinBoxDelegate

    SpinBoxDelegate例子是Qt Assistant中提供的一个非常优秀的例子,虽然讲的是继承于QItemDelegate的例子.但对于我们理解Delegate-委托这个概念,非常有帮助. 它 ...

  2. 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

    最简单的基于libVLC的例子文章列表: 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器 最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器(图形界面版) 最简 ...

  3. 基于QStyledItemDelegate的例子 Star Delegate Example

    这节需要事件.绘图等基础知识,比较复杂...先收藏,后续学习. Star Delegate Example http://doc.qt.nokia.com/4.7-snapshot/itemviews ...

  4. GJM: Unity3D基于Socket通讯例子 [转载]

    首先创建一个C# 控制台应用程序, 直接服务器端代码丢进去,然后再到Unity 里面建立一个工程,把客户端代码挂到相机上,运行服务端,再运行客户端. 高手勿喷!~! 完全源码已经奉上,大家开始研究吧! ...

  5. Qt自定义委托在QTableView中绘制控件、图片、文字

    自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...

  6. 基于DDD的.NET开发框架 - ABP领域服务

    返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...

  7. 深入理解面向对象 -- 基于 JavaScript 实现

    我们在学习编程时,避免不了会接触一个概念,叫:面向对象编程(Object-oriented programming,缩写:oop) (不是搞对象那个对象哈),其实我们的编程方式,不止有面向对象,还有 ...

  8. Mule 官方例子研究

    Mule 官方例子研究 一.编译导入Mule自带的例子 1.准备 安装Mule.这里就不介绍mule的安装了,请参考<Mule安装部署手册>. 2. 编译Mule自带例子中的Hello例子 ...

  9. 推荐系统--基于图的推荐算法

    基于图的模型(graph−basedmodel )是推荐系统中的重要内容.在研究基于图的模型之前,首先需要将用户行为数据表示成图的形式.这里我们将用户行为数据用二分图表示,例如用户数据是由一系列的二元 ...

最新文章

  1. 从快的打车:说O2O产品的奇特推广模式
  2. 关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了
  3. C/C++学习之路: 继承
  4. 算法篇---java经典问题!!!
  5. ABAP中创建动态内表的三种方法(转载)
  6. python-列表包字典-根据字典的某一个键的值来进行排序
  7. Android Ubuntu 安装问题FAQ
  8. 创建设计模式 - Singleton设计模式(最佳实践与示例)
  9. GDB watch的使用
  10. SSM药店管理系统的设计与实现答辩PPT模板
  11. AspNetPager控件+repeater+Ajax+存储过程实现高效分页,还有漂亮控件样式
  12. JavaBean对象转Map对象
  13. 单片机仿真软件Proteus安装时遇到的问题
  14. 双向可控硅的工作原理
  15. 用Python模拟同步时钟
  16. pdf怎么提取页面,pdf页面提取方法
  17. Android 广播接收不到短信问题,Android中短信的广播接收问题
  18. 关系;关系模式;关系数据库
  19. 3D中的方位和角位移(1)
  20. 视频工具箱和硬件加速

热门文章

  1. linux安装tomcat后启动报错Cannot find ./catalina.sh的解决方法
  2. JavaScript随机排序算法1
  3. Lucene学习之四:Lucene的索引文件格式(3)
  4. MOS管正确选择的步骤
  5. Android 去除标题栏和状态栏的方法
  6. Linux ISATAP配置
  7. 线程通信之多个线程循环执行,(A线程执行5次,B线程执行10次,C线程执行15次)...
  8. JAVA进制的表示方式
  9. Web测试中新增修改功能测试
  10. CSS 伪类(Pseudo-classes)