Qt QTableView显示日期时间格式

我们会经常做一些表格显示信息,其中经常有日期时间信息。

当使用Qt的Model/View时,如果你用view自带的delegate,显示的时间可能不能符合要求。

这就需要我们编写新的delegate类。以下是一个专门用于显示日期时间的delegate类“TimeEditDelegate”,取自Qt Wiki,我做了改动。

.h文件

  1. #ifndefTIMEEDITDELEGATE_H
  2. #defineTIMEEDITDELEGATE_H
  3. #include<QItemDelegate>
  4. class TimeEditDelegate: public QItemDelegate
  5. {
  6. Q_OBJECT
  7. public :
  8. TimeEditDelegate(const QStringtimeFormat= "dd.MM.yyyyhh:mm:ss" ,QObject*parent=0):QItemDelegate(parent)
  9. {this ->timeformat=timeFormat;};
  10. void paint(QPainter*painter, const QStyleOptionViewItem&option,
  11. const QModelIndex&index) const ;
  12. private :
  13. QStringtimeformat;
  14. };
  15. #endif//TIMEEDITDELEGATE_H

#ifndef TIMEEDITDELEGATE_H #define TIMEEDITDELEGATE_H #include <QItemDelegate> class TimeEditDelegate : public QItemDelegate { Q_OBJECT public: TimeEditDelegate(const QString timeFormat = "dd.MM.yyyy hh:mm:ss",QObject *parent = 0) : QItemDelegate(parent) {this->timeformat = timeFormat;}; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; private: QString timeformat; }; #endif // TIMEEDITDELEGATE_H

.cpp文件

  1. #include"timeeditdelegate.h"
  2. #include<QModelIndex>
  3. #include<QPainter>
  4. #include<QDateTime>
  5. #include<QStyleOptionViewItemV3>
  6. #include<QStyleOptionViewItemV2>
  7. void TimeEditDelegate::paint(QPainter*painter, const QStyleOptionViewItem&option,
  8. const QModelIndex&index) const
  9. {
  10. QDateTimedtval=index.model()->data(index,Qt::DisplayRole).toDateTime();
  11. QStringindexvalue=tr("Datenotset" );
  12. if (dtval.isValid())
  13. {
  14. indexvalue=dtval.toString(timeformat);
  15. }
  16. Q_ASSERT(index.isValid());
  17. QStyleOptionViewItemV3opt=setOptions(index,option);
  18. const QStyleOptionViewItemV2*v2=qstyleoption_cast< const QStyleOptionViewItemV2*>(&option);
  19. opt.features=v2?v2->features
  20. :QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None);
  21. const QStyleOptionViewItemV3*v3=qstyleoption_cast< const QStyleOptionViewItemV3*>(&option);
  22. opt.locale=v3?v3->locale:QLocale();
  23. opt.widget=v3?v3->widget:0;
  24. //prepare
  25. painter->save();
  26. painter->setClipRect(opt.rect);
  27. //getthedataandtherectangles
  28. QVariantvalue;
  29. QPixmappixmap;
  30. QRectdecorationRect;
  31. value=index.data(Qt::DecorationRole);
  32. QStringtext;
  33. QRectdisplayRect;
  34. value=index.data(Qt::DisplayRole);
  35. if (value.isValid()){
  36. text=indexvalue;
  37. displayRect=textRectangle(painter,option.rect,opt.font,text);
  38. }
  39. QRectcheckRect;
  40. Qt::CheckStatecheckState=Qt::Unchecked;
  41. value=index.data(Qt::CheckStateRole);
  42. if (value.isValid()){
  43. checkState=static_cast <Qt::CheckState>(value.toInt());
  44. checkRect=check(opt,opt.rect,value);
  45. }
  46. //dothelayout
  47. doLayout(opt,&checkRect,&decorationRect,&displayRect,false );
  48. //drawtheitem
  49. drawBackground(painter,opt,index);
  50. drawCheck(painter,opt,checkRect,checkState);
  51. drawDecoration(painter,opt,decorationRect,pixmap);
  52. drawDisplay(painter,opt,displayRect,text);
  53. drawFocus(painter,opt,displayRect);
  54. //done
  55. painter->restore();
  56. }

#include "timeeditdelegate.h" #include <QModelIndex> #include <QPainter> #include <QDateTime> #include <QStyleOptionViewItemV3> #include <QStyleOptionViewItemV2> void TimeEditDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QDateTime dtval = index.model()->data(index, Qt::DisplayRole).toDateTime(); QString indexvalue = tr("Date not set"); if(dtval.isValid()) { indexvalue = dtval.toString(timeformat); } Q_ASSERT(index.isValid()); QStyleOptionViewItemV3 opt = setOptions(index, option); const QStyleOptionViewItemV2 *v2 = qstyleoption_cast<const QStyleOptionViewItemV2 *>(&option); opt.features = v2 ? v2->features : QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None); const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option); opt.locale = v3 ? v3->locale : QLocale(); opt.widget = v3 ? v3->widget : 0; // prepare painter->save(); painter->setClipRect(opt.rect); // get the data and the rectangles QVariant value; QPixmap pixmap; QRect decorationRect; value = index.data(Qt::DecorationRole); QString text; QRect displayRect; value = index.data(Qt::DisplayRole); if (value.isValid()) { text = indexvalue; displayRect = textRectangle(painter, option.rect, opt.font, text); } QRect checkRect; Qt::CheckState checkState = Qt::Unchecked; value = index.data(Qt::CheckStateRole); if (value.isValid()) { checkState = static_cast<Qt::CheckState>(value.toInt()); checkRect = check(opt, opt.rect, value); } // do the layout doLayout(opt, &checkRect, &decorationRect, &displayRect, false); // draw the item drawBackground(painter, opt, index); drawCheck(painter, opt, checkRect, checkState); drawDecoration(painter, opt, decorationRect, pixmap); drawDisplay(painter, opt, displayRect, text); drawFocus(painter, opt, displayRect); // done painter->restore(); }

使用方法

  1. View->setItemDelegateForColumn(c, new TimeEditDelegate( "yyyy-dd-MM" ));

View->setItemDelegateForColumn(c, new TimeEditDelegate("yyyy-dd-MM"));

其中,c是需要显示日期时间的列号。"yyyy-dd-MM"是显示的格式。两个中文常用格式为:

yyyy-dd-MM 例子:2009-12-25

yyyy-dd-MM hh:mm:ss 例子:2009-12-25 12:25:32

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值