Qt QTableView显示日期时间格式

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

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

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

.h文件

  1. #ifndefTIMEEDITDELEGATE_H
  2. #defineTIMEEDITDELEGATE_H
  3. #include<QItemDelegate>
  4. classTimeEditDelegate:publicQItemDelegate
  5. {
  6. Q_OBJECT
  7. public:
  8. TimeEditDelegate(constQStringtimeFormat="dd.MM.yyyyhh:mm:ss",QObject*parent=0):QItemDelegate(parent)
  9. {this->timeformat=timeFormat;};
  10. voidpaint(QPainter*painter,constQStyleOptionViewItem&option,
  11. constQModelIndex&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. voidTimeEditDelegate::paint(QPainter*painter,constQStyleOptionViewItem&option,
  8. constQModelIndex&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. constQStyleOptionViewItemV2*v2=qstyleoption_cast<constQStyleOptionViewItemV2*>(&option);
  19. opt.features=v2?v2->features
  20. :QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None);
  21. constQStyleOptionViewItemV3*v3=qstyleoption_cast<constQStyleOptionViewItemV3*>(&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,newTimeEditDelegate("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

你可能感兴趣的:(QTableView)