- 浏览: 3444051 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
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_OBJECT public: 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) { //ok if (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_OBJECT public: 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); }
- trackeditor.rar (6 KB)
- 下载次数: 149
发表评论
-
Qt官网变更【2012】
2012-09-21 19:30 4213Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 4988看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 21118最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2858一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21371一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17889QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8582FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 43741.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4693最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4863Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9674QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 23087双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8440创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14855前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12199为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5593不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2185Test<IMG SRC="cf08e32c2 ...
相关推荐
2. **MainWindow.cpp**: 主窗口类的实现,通常包含用户界面的主要元素,如菜单、工具栏、视图等。在这个例子中,主窗口可能有一个专门用来展示Gantt图的区域,用户可以通过这个窗口与Gantt图交互,如添加、删除、...
在Qt中,代理(QItemDelegate)和委托(QSortFilterProxyModel)是两个关键概念,它们对于实现复杂的数据显示和交互功能至关重要。本文将深入探讨这两个概念,并结合自定义开关控件进行讲解。 首先,让我们了解...
`QItemDelegate`是QT提供的一种基础委托类,我们可以基于它进行扩展,以适应各种特定的需求。 在"Delegates.7z"这个压缩包中,提供的是一系列使用`QT`中的`Delegates`的实例代码。这些代码涵盖了多种编辑方式,包括...
在本项目"QT自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现"中,我们将深入探讨如何利用QT库中的核心组件构建一个强大的数据展示和交互界面。 首先,我们要理解View/Model/...
2. 实现`createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index)`,创建自定义编辑器控件,比如日期选择器、颜色选择器等。 3. 覆盖`setEditorData(QWidget *editor, const ...
2. `sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const`:返回一个表示项大小的`QSize`,用于确定表格单元格的尺寸。 3. `createEditor(QWidget *parent, const QStyleOptionViewItem...
Qt开发的通讯录小程序。 学习QT时,参照网上的例子完成的小程序,主要是练习之用,不当之处在所难免...2.QSqlTableModel / QDataWidgetMapper / QItemDelegate等类的使用 3.Windows环境下摄像头的使用 4.图像的表示方法
在Qt框架中,`QTableView`是用于展示二维表格数据的控件,它基于`QAbstractItemView`类。在一些复杂的应用场景中,我们可能需要在`QTableView`的单元格内添加自定义的控件,比如按钮、下拉框等,以提供更丰富的交互...
文档会介绍如何使用QAbstractItemModel、QAbstractItemView和QItemDelegate来实现MODEL/VIEW 架构。 16. **拖放**: 拖放功能是许多现代应用程序的必备功能。Qt中的拖放功能允许在应用程序内部以及应用程序与操作...
QT中delegate自定义委托的小例子,有注释说明和源码 简单基础部件的委托可以继承QItemDelegate,并使用这些函数的默认实现,委托编辑器可以通过使用小工具来管理编辑过程或直接处理事件来实现。 使用Delegate的原因...
2. **工厂模式**:Qt的QObject类提供了动态对象创建的能力,通过QMetaObject和QMetaMethod,可以实现基于元对象系统的工厂模式,动态创建和调用不同类型的对象。 3. **观察者模式**:Qt的信号与槽机制是观察者模式...
2. 创建自定义的QItemDelegate子类,处理单元格的显示和编辑。 3. 将自定义的QHeaderView和QItemDelegate应用到QTableView上,通过`setHorizontalHeader()`和`setItemDelegate()`方法设置它们。 4. 配置QTableView的...
3. **排序和分页**:支持基于某一列的数据排序,以及通过代理实现分页功能。 4. **数据编辑**:默认情况下,用户可以直接点击单元格进行编辑,也可以自定义编辑行为。 代理(QItemDelegate)在模型视图架构中起到...
3. **第一个QtGUI应用**:本节将会引导读者通过简单的例子创建第一个基于Qt的GUI应用程序,从而对Qt的开发环境和工具有一个初步的认识。 #### 第二章 布局管理器 1. **QHBoxLayout与QVBoxLayout**:Qt中的布局管理...
### 2. 应用自定义委托 创建了自定义委托后,我们需要将其应用到`QTableView`上: ```cpp QTableView *tableView = new QTableView; tableView->setItemDelegate(new MyCustomDelegate(tableView)); ``` ### 3. ...
虽然为了这个目的我们设置了一个自定义的基于整数的表模型,我们可以很容易地使用QStandardItemModel来代替,因为自定义委托控制数据输入。我们构造了一个表视图来显示模型的内容,可以使用自定义的委托来进行编辑。
2. **创建自定义委托类** 自定义委托通常通过继承`QItemDelegate`来实现。例如,我们可以创建一个新的类`MyCustomDelegate`,并在其中重写必要的方法。首先,在头文件中声明委托类: ```cpp class ...
"Qt ModelView 演示"项目着重展示了`QItemDelegate`的使用,这是一个关键组件,允许我们对QTableView、QListView和QTreeView等视图组件进行自定义渲染和编辑行为。 首先,我们要理解Qt的Model/View编程模型。该模型...
在Qt框架中,QComboBox是一个常用的控件,用于在下拉列表中显示可选择的项目。这个控件在用户界面设计中非常常见,比如在创建一个应用时,如果...希望这个例子能帮助你理解如何在Qt中有效地利用QComboBox及其委托机制。