`
izuoyan
  • 浏览: 8933286 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

.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. }

使用方法

  1. 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics