我们会经常做一些表格显示信息,其中经常有日期时间信息。
当使用Qt的Model/View时,如果你用view自带的delegate,显示的时间可能不能符合要求。
这就需要我们编写新的delegate类。以下是一个专门用于显示日期时间的delegate类“TimeEditDelegate”,取自Qt Wiki,我做了改动。
.h文件
- #ifndefTIMEEDITDELEGATE_H
- #defineTIMEEDITDELEGATE_H
- #include<QItemDelegate>
- classTimeEditDelegate:publicQItemDelegate
- {
- Q_OBJECT
- public:
- TimeEditDelegate(constQStringtimeFormat="dd.MM.yyyyhh:mm:ss",QObject*parent=0):QItemDelegate(parent)
- {this->timeformat=timeFormat;};
- voidpaint(QPainter*painter,constQStyleOptionViewItem&option,
- constQModelIndex&index)const;
- private:
- QStringtimeformat;
- };
- #endif//TIMEEDITDELEGATE_H
.cpp文件
- #include"timeeditdelegate.h"
- #include<QModelIndex>
- #include<QPainter>
- #include<QDateTime>
- #include<QStyleOptionViewItemV3>
- #include<QStyleOptionViewItemV2>
- voidTimeEditDelegate::paint(QPainter*painter,constQStyleOptionViewItem&option,
- constQModelIndex&index)const
- {
- QDateTimedtval=index.model()->data(index,Qt::DisplayRole).toDateTime();
- QStringindexvalue=tr("Datenotset");
- if(dtval.isValid())
- {
- indexvalue=dtval.toString(timeformat);
- }
- Q_ASSERT(index.isValid());
- QStyleOptionViewItemV3opt=setOptions(index,option);
- constQStyleOptionViewItemV2*v2=qstyleoption_cast<constQStyleOptionViewItemV2*>(&option);
- opt.features=v2?v2->features
- :QStyleOptionViewItemV2::ViewItemFeatures(QStyleOptionViewItemV2::None);
- constQStyleOptionViewItemV3*v3=qstyleoption_cast<constQStyleOptionViewItemV3*>(&option);
- opt.locale=v3?v3->locale:QLocale();
- opt.widget=v3?v3->widget:0;
- //prepare
- painter->save();
- painter->setClipRect(opt.rect);
- //getthedataandtherectangles
- QVariantvalue;
- QPixmappixmap;
- QRectdecorationRect;
- value=index.data(Qt::DecorationRole);
- QStringtext;
- QRectdisplayRect;
- value=index.data(Qt::DisplayRole);
- if(value.isValid()){
- text=indexvalue;
- displayRect=textRectangle(painter,option.rect,opt.font,text);
- }
- QRectcheckRect;
- Qt::CheckStatecheckState=Qt::Unchecked;
- value=index.data(Qt::CheckStateRole);
- if(value.isValid()){
- checkState=static_cast<Qt::CheckState>(value.toInt());
- checkRect=check(opt,opt.rect,value);
- }
- //dothelayout
- doLayout(opt,&checkRect,&decorationRect,&displayRect,false);
- //drawtheitem
- 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();
- }
使用方法
- 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