在 Qt 模型/视图中修改数据表示
Posted
技术标签:
【中文标题】在 Qt 模型/视图中修改数据表示【英文标题】:Modifying data representation in Qt model/view 【发布时间】:2016-02-28 08:00:26 【问题描述】:我使用的是 Qt 5.4.2,但在尝试从模型填充视图时如何更改数据“表示”时遇到了麻烦。我有一个 QSqlTableModel 来保存数据库数据和一个 QTableView 来显示数据库的内容。
现在数据库中的一些数据与我想在视图中显示的格式不同。例如,我想以不同的方式显示日期格式,但我不知道在哪里/如何实现这种逻辑。我不希望模型受到任何影响,只影响视图中显示的数据。
【问题讨论】:
【参考方案1】:您应该为特定列实现自定义委托并手动设置它。只需实现一个派生自QStyledItemDelegate
的类,例如:
#include <QItemDelegate>
#include <QDateTimeEdit>
class DateTimeEditDelegate: public QStyledItemDelegate
Q_OBJECT
public:
DateTimeEditDelegate(QObject *parent = 0);
void *paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
QWidget *createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
void setEditorData( QWidget *editor,
const QModelIndex &index ) const;
void setModelData( QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index ) const;
void updateEditorGeometry( QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
mutable QDateTimeEdit *dataTimeEdit;
private slots:
void setData(QDateTime val);
;
DateTimeEditDelegate::DateTimeEditDelegate(QObject *parent ):QStyledItemDelegate(parent)
void*DateTimeEditDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QDateTime dateTime = index.model()->data( index, Qt::DisplayRole ).toDateTime();
painter->drawText(option.rect().topLeft(), dateTime.toString());
return;
QWidget *DateTimeEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
dataTimeEdit = new QDateTimeEdit( parent );
QObject::connect(dataTimeEdit,SIGNAL(dateTimeChanged(QDateTime)),this,SLOT(setData(QDateTime)));
return dataTimeEdit;
void DateTimeEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
QVariant dateTime = index.model()->data( index, Qt::DisplayRole );
(static_cast<QDateTimeEdit*>( editor ))->setDateTime(dateTime.toDateTime());
void DateTimeEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
model->setData( index, static_cast<QDateTimeEdit*>( editor )->dateTime() );
void DateTimeEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
editor->setGeometry( option.rect );
void DateTimeEditDelegate::setData(QDateTime val)
emit commitData(dataTimeEdit);
最后将委托的实例设置为列:
ui->tableView->setItemDelegateForColumn(0, new DateTimeEditDelegate(ui->tableView));
这只是一个代理示例,它在自定义数据编辑过程中实现自定义数据表示。您应该根据自己的需要实施自己的。
【讨论】:
以上是关于在 Qt 模型/视图中修改数据表示的主要内容,如果未能解决你的问题,请参考以下文章