- 浏览: 3449550 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数,
1、实现在QTableView中绘制 格式字符串
2、实现在QTableView中绘制进度条
3、实现在QTableView中绘制QCheckBox
4、实现在QTableView中绘制星星
5、实现在QTableView中绘制Pixmap图片
1、实现在QTableView中绘制 格式字符串
//重载绘制函数 void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { //如果是第2列'病人Id' if (index.column() == 2) { //获得当前项值 int patientId = index.model()->data(index, Qt::DisplayRole).toInt(); //设置'病人Id'格式字符串: P:00000x;6位10进制数,不足补0; QString text = QString("P:%1").arg(patientId, 6, 10, QChar('0')); //获取项风格设置 QStyleOptionViewItem myOption = option; myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; //绘制文本 QApplication::style()->drawItemText ( painter, myOption.rect , myOption.displayAlignment, QApplication::palette(), true,text ); } else { //否则调用默认委托 QStyledItemDelegate::paint(painter, option, index); } }
如果自定义委托继承于QItemDelegate类,绘制字符串,可以直接用QItemDelegate中的drawDisplay();
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); } }
2、实现在QTableView中绘制进度条
//重载绘制函数 void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { //如果是'已经完成子任务数' if (index.column() == 9) { const QAbstractItemModel *itemModel = index.model(); //获得索引对应Model中的数据 int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).toInt(); int subTaskNum = itemModel->data(itemModel->index(index.row(),8), Qt::DisplayRole).toInt(); //进度条的风格选项 QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionProgressBarV2(); progressBarOption->rect = option.rect; progressBarOption->minimum = 0; progressBarOption->maximum = subTaskNum; progressBarOption->progress = finishedSubTaskNum; int t = finishedSubTaskNum/subTaskNum; progressBarOption->text = QString::number(t) + "%"; progressBarOption->textVisible = true; //绘制进度条 QApplication::style()->drawControl(QStyle::CE_ProgressBar, progressBarOption, painter); } else { //否则调用默认委托 QStyledItemDelegate::paint(painter, option, index); } }
3、实现在QTableView中绘制QCheckBox
#include <QtGui> #include <QItemDelegate> #include <QStyleOptionProgressBarV2> #include "DelReconQueue.h" //重载绘制函数 void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 11) { //获取值 bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); //按钮的风格选项 QStyleOptionButton *checkBoxOption = new QStyleOptionButton(); checkBoxOption->state |= QStyle::State_Enabled; //根据值判断是否选中 if(checked) { checkBoxOption->state |= QStyle::State_On; } else { checkBoxOption->state |= QStyle::State_Off; } //返回QCheckBox几何形状 checkBoxOption->rect = CheckBoxRect(option); //绘制QCheckBox QApplication::style()->drawControl(QStyle::CE_CheckBox,checkBoxOption,painter); } else { //否则调用默认委托 QStyledItemDelegate::paint(painter, option, index); } }
//生成QCheckBox
QRect DgSystemLog::CheckBoxRect(const QStyleOptionViewItem &viewItemStyleOptions)const { //绘制按钮所需要的参数 QStyleOptionButton checkBoxStyleOption; //按照给定的风格参数 返回元素子区域 QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkBoxStyleOption); //返回QCheckBox坐标 QPoint checkBoxPoint(viewItemStyleOptions.rect.x() + viewItemStyleOptions.rect.width() / 2 - checkBoxRect.width() / 2, viewItemStyleOptions.rect.y() + viewItemStyleOptions.rect.height() / 2 - checkBoxRect.height() / 2); //返回QCheckBox几何形状 return QRect(checkBoxPoint, checkBoxRect.size()); }
4、实现在QTableView中绘制自定义类 星星
//重载绘制函数 void StarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { //如果某项数据是星星类型 if (qVariantCanConvert<StarRating>(index.data())) { //获取该项数据,并转换成StarRating类型 StarRating starRating = qVariantValue<StarRating>(index.data()); //如果有控件被选中,我们就让选中的控件变亮 if (option.state & QStyle::State_Selected) painter->fillRect(option.rect, option.palette.highlight()); starRating.paint(painter, option.rect, option.palette, StarRating::ReadOnly); } //如果没有控件选中,调用默认委托 else { QStyledItemDelegate::paint(painter, option, index); } }
星星自定义源文件
#ifndef STARRATING_H #define STARRATING_H #include <QMetaType> #include <QPointF> #include <QVector> class StarRating { public: enum EditMode { Editable, ReadOnly }; StarRating(int starCount = 1, int maxStarCount = 5); void paint(QPainter *painter, const QRect &rect, const QPalette &palette, EditMode mode) const; QSize sizeHint() const; int starCount() const { return myStarCount; } int maxStarCount() const { return myMaxStarCount; } void setStarCount(int starCount) { myStarCount = starCount; } void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; } private: QPolygonF starPolygon; QPolygonF diamondPolygon; int myStarCount; int myMaxStarCount; }; //让所有模板类型都知道该类,包括QVariant Q_DECLARE_METATYPE(StarRating) #endif #include <QtGui> #include <math.h> #include "starrating.h" const int PaintingScaleFactor = 20; StarRating::StarRating(int starCount, int maxStarCount) { myStarCount = starCount; myMaxStarCount = maxStarCount; starPolygon << QPointF(1.0, 0.5); for (int i = 1; i < 5; ++i) starPolygon << QPointF(0.5 + 0.5 * cos(0.8 * i * 3.14), 0.5 + 0.5 * sin(0.8 * i * 3.14)); diamondPolygon << QPointF(0.4, 0.5) << QPointF(0.5, 0.4) << QPointF(0.6, 0.5) << QPointF(0.5, 0.6) << QPointF(0.4, 0.5); } QSize StarRating::sizeHint() const { return PaintingScaleFactor * QSize(myMaxStarCount, 1); } void StarRating::paint(QPainter *painter, const QRect &rect, const QPalette &palette, EditMode mode) const { painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(Qt::NoPen); if (mode == Editable) { painter->setBrush(palette.highlight()); } else { painter->setBrush(palette.foreground()); } int yOffset = (rect.height() - PaintingScaleFactor) / 2; painter->translate(rect.x(), rect.y() + yOffset); //画笔坐标 painter->scale(PaintingScaleFactor, PaintingScaleFactor); for (int i = 0; i < myMaxStarCount; ++i) { if (i < myStarCount) { painter->drawPolygon(starPolygon, Qt::WindingFill); } else if (mode == Editable) { painter->drawPolygon(diamondPolygon, Qt::WindingFill); } painter->translate(1.0, 0.0); } painter->restore(); }
5、实现在QTableView中绘制Pixmap图片 ,
详细请看具体例子 Qt-在表格(QTableView)中插入图片
void MyItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { if(index.column()!=0){ QItemDelegate::paint(painter,option,index); return; } const QAbstractItemModel * model=index.model(); QVariant var=model->data(index,Qt::CheckStateRole); if(var.isNull()) var=false; const QPixmap & star=var.toBool()? favouritePixmap:notFavouritePixmap; int width=star.width(); int height=star.height(); QRect rect=option.rect; int x=rect.x()+rect.width()/2-width/2; int y=rect.y()+rect.height()/2-height/2; painter->drawPixmap(x,y,star); }
参考文章
Qt-在表格(QTableView)中插入图片
基于QItemDelegate的例子2 trackeEditorDelegate
基于QItemDelegate的例子1 SpinBoxDelegate
(六)Qt Delgate的使用 简单说明
发表评论
-
Qt官网变更【2012】
2012-09-21 19:30 4221Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 5010看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 21136最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2868一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21405一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17910QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8616FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 44001.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4701最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4877Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9683QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 23140双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8466创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14887前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12223为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5599不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2195Test<IMG SRC="cf08e32c2 ...
相关推荐
这个自定义委托的概念在标题和描述中被提及,意味着我们将探讨如何在QTableView中添加复选框、进度条和时间等控件。 自定义委托是Qt提供的一种机制,允许开发人员为表格视图中的每一项数据创建个性化的显示和编辑...
当我们想要在QTableView中添加复选框或下拉框时,就需要创建一个自定义的委托类来处理这些控件的绘制和交互逻辑。 对于复选框,我们可以继承QStyledItemDelegate,并重写`paint()`方法,以便在绘制项时添加一个复选...
在本项目"QT自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现"中,我们将深入探讨如何利用QT库中的核心组件构建一个强大的数据展示和交互界面。 首先,我们要理解View/Model/...
在Qt中,代理(QItemDelegate)和委托(QSortFilterProxyModel)是两个关键概念,它们对于实现复杂的数据显示和交互功能至关重要。本文将深入探讨这两个概念,并结合自定义开关控件进行讲解。 首先,让我们了解...
5. **QAbstractItemView::setIndexWidget()**:为了在QTableView的特定单元格中放置自定义控件,我们需要调用此方法。它接受一个QModelIndex和一个QWidget,将控件绑定到模型的特定索引上。 6. **事件过滤器**:...
在Qt编程中,QTableView是用于显示表格数据的控件,常见于数据密集型的应用程序。当处理大型数据集时,冻结行和列可以提高用户的交互体验,让他们更容易浏览和理解表格内容。QTableView默认并不支持直接冻结行列,但...
本实例将探讨如何在QTTableView中集成复选框和按钮控件,以增强用户界面的交互性。QTTableView是QT框架中的一个关键组件,它允许我们展示和操作表格数据。下面将详细讲解这一实现过程。 1. **QT与Mingw**: Mingw...
1.自定义了一个表格View(TcTableView),支持继承重载相关虚函数, 2.TcTabelView支持设置多行横向表头(默认2行), 3.可以添加多张表格,每个表格是独立的,它们都有属于自己的自定义表头。 4.表头的右键操作我是自己写...
在Qt框架中,QTableView是用于显示表格数据的控件,它可以很好地与各种模型(如QStandardItemModel或QSqlTableModel)结合使用。本教程将详细讲解如何在QTableView中实现复选框、分页和查询功能,并涉及与MySQL...
在Qt框架中,`QTableView`和`QTableWidget`是两种常用的用于显示二维数据的控件。在一些复杂的用户界面设计中,我们可能需要对表头进行自定义,例如添加复选框或下拉框,以提供更丰富的交互功能。在本篇中,我们将...
在本文中,我们将深入探讨如何在Qt环境中使用`QTableView`控件来插入和添加各种交互式元素,如按钮、复选框、日期选择器以及列表选择等。`QTableView`是Qt库中的一个关键组件,它允许我们展示和操作二维表格数据。这...
在Qt框架中,`QTableView`是一个非常常用的控件,用于展示二维表格数据。而有时候,我们可能需要在表格的某一列中显示可选的复选框(CheckBox),以供用户进行选择操作。本篇文章将深入讲解如何在`QTableView`中实现...
在QT中,"委托类"(QItemDelegate)与"代理类"(QAbstractItemView)是数据展示的核心组件,特别是在处理表格(QTableView)、列表(QListView)和树形视图(QTreeView)时。本压缩包文件"QT自定义委托类代理类.rar...
在Qt框架中,QTableView是用于显示表格数据的控件,它可以用来展示数据库或模型数据。本教程将深入探讨如何在QTableView中添加复选框,特别是在表头和第一列中实现这一功能,以增强用户界面的交互性。 首先,我们要...
在Qt框架中,QTableView是用于显示表格数据的控件,它可以用来展示数据库或模型数据。在实际开发中,我们经常需要对QTableView进行自定义,例如在其单元格内添加更多的交互元素,如QSpinBox(数值选择器)、...
在QT中,QTableView是用于显示表格数据的控件,它允许用户查看和编辑二维表格数据。当我们需要创建更复杂的表格布局,例如带有多行表头的表格时,QT提供了丰富的自定义能力。 "QT自定义多行表头"这个主题主要涉及到...
`createEditor()`方法用于创建要在单元格内显示的控件,`setEditorData()`设置控件的初始数据,`setModelData()`则将用户在控件中的修改反映回模型,`paint()`负责绘制单元格的外观。 以下是一个基本的实现步骤: ...
在Qt框架中,QTableView是用于显示表格数据的控件,而Model/View体系则是Qt设计模式的核心部分,它提供了一种灵活的方式来管理和显示数据。本篇将详细讲解如何利用QTableView与Model协同工作,实现复杂的功能,如在...
在Qt框架中,QTableView是用于显示表格数据的控件,它是Qt Widgets模块的一部分,广泛应用于桌面应用开发。QTableView可以结合QAbstractItemModel或QStandardItemModel来展示数据,并允许用户进行交互,如编辑、排序...
在Qt框架中,`QTableView`是一个非常常用的控件,用于展示二维表格数据。在实际应用中,我们可能需要在表格中不仅展示文本信息,还要包含其他元素,比如自定义的复选框(Checkbox)和文件图标。在描述中提到的场景中...