- 浏览: 3415607 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
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 4123Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 4894看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 20968最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2762一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21166一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17791QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8452FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 42991.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4617最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4796Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9603QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 22854双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8347创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14715前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12097为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5527不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2125Test<IMG SRC="cf08e32c2 ...
相关推荐
我们在之前写的[《QT(7)-初识委托》](https://blog.csdn.net/qq_40666149/article/details/128674837)文章末尾提到,***“使用一个类继承QStyledItemDelegate实现常用的控件委托,在使用时可以直接调用接口,灵活...
qtableview 自定义委托 checkbox,进度条、时间等控件
QTableView 中单元格添加控件的实例代码(含combobox)QTableView 中单元格添加控件的实例代码(含combobox)QTableView 中单元格添加控件的实例代码(含combobox)
1.自定义了一个表格View(TcTableView),支持继承重载相关虚函数, 2.TcTabelView支持设置多行横向表头(默认2行), 3.可以添加多张表格,每个表格是独立的,它们都有属于自己的自定义表头。 4.表头的右键操作我是自己写...
qt qtableview在表头中添加combobox,checkbox,spinbox
QT自定义模型Modle的实现实例和自定义委托Delegate的实现实例以及在QTableView中加载使用的实现
QTableView添加复选框,下拉框控件
原文为《Qt中将QTableView中的数据导出为Excel文件>>,地址http://blog.csdn.net/superjoel/article/details/5321404。代码为QT4,QT5有些问题,因为只是参考里面的代码,就不是很在意。
如何设置编辑QTableView单元格时的字体颜色
该工程使用vs2010编译,实现windows先文件夹指定类型扫描,以及扫描到的文件界面展示。主要涉及到Qt托管类的使用方法,以及自定义tableview和model的实现方法。
主要介绍了Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例,需要的朋友可以参考下
QT QTableView 多行表头,自定义表头,继承 QTableView
在QTableView 中添加Combo控件,实现列表中的下拉选择控件,在Qt中Demo有了编辑框和spin的列表控件,我在demo中spin的工程中添加了combo,实现列表中的combo下拉选择控件,其他的控件也可以参考此方法开发,新加的为...
一个可编辑的QTableView控件列表,包括按钮,复选框 日期选择,列表选择等按钮在QTableView中的使用,其中包含不同编译器下的源代码调试,QT编译器和Vs2008编译器两个版本。
完整工程代码,看完了你的QT View/Model 和 delegate就算入门了。
qt实现了QTableView中添加复选框(包括表头复选框),分页,查询功能,创建数据库(mysql)的sql文件也包含
基于QT中的QTableView实现表格翻页标签(精准定位、表格可拖动大小、可与滑动条联动)
QTableView 中单元格添加控件的实例代码
QTableView显示自定义CheckBox, 开发环境macos 10.13.1 Qt 5.9.1