使用QItemDelegate在QTableView中显示其他数据

6

我有一个与QSqlTableModel连接的QTableView。
在第一列中,只有这种格式的日期: 2010-01-02
我希望这一列以这种格式显示日期(但不改变实际数据): 02.01.2010
我知道我必须为这一列创建一个QItemDelegate,但我不知道如何读取现有的数据并用其他内容覆盖它。你有什么想法如何管理它吗?

2个回答

15

最简单的解决方案是创建一个QStyledItemDelegate子类并重新实现displayText(...),例如:

class DateFormatDelegate : public QStyledItemDelegate
{
public:
 DateFormatDelegate (QString dateFormat, QObject *parent = 0) : 
  QStyledItemDelegate(parent),
  m_dateFormat(dateFormat)
 {
 }

 virtual QString displayText(const QVariant & value, const QLocale & locale ) const
 {
  Q_UNUSED(locale);
  return value.toDate().toString(m_dateFormat);
 }

private:
 QString m_dateFormat;
};

那么在你的视图中 -

setItemDelegateForColumn(/*date column*/, new DateFormatDelegate("MM.dd.yyyy", this));

4
一个项委托并不一定改变数据,它只是渲染数据。此外,如果您使用的是Qt 4.4或更高版本,请查看QStyledItemDelegate--它具有主题感知能力,并且看起来更漂亮。
这篇文章中有一个项委托的示例(似乎是现在已经下架或消失的官方文档的镜像)。
既然您真正想做的只是自定义文本,那么您是否考虑使用代理模型,只需为日期列的DisplayRole返回自定义QString?

无论是委托还是代理模式,在这种情况下都可以很好地工作。然而,委托模式可能更接近于预期的结果。 - Caleb Huitt - cjhuitt
我的问题是,我不知道如何使用QItemDelegate来实现它。paint()方法对我无效。 - Berschi
具体来说,paint()方法有什么问题? - ChrisV
我知道如何获取数据(qVariantValue<QString>(index.data())),但我不知道如何用"foo"来覆盖它。 - Berschi
这就是使用代理模型的好处所在,因为它更容易支持行/列/类型特定的hack,但既然你显然真的想要一个委托...创建一个QStyledItemDelegate子类,重新实现paint()和sizeHint()。这些实现应该实际检查index.data()是否返回变量中的QDate;如果没有,则只需调用基类的实现。如果是,则进行自己的字符串转换并测量它(对于sizeHint())或绘制它(对于paint())。 - ChrisV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接