在 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 模型/视图中修改数据表示的主要内容,如果未能解决你的问题,请参考以下文章

具有两种不同视图的 Qt 数据模型

26.QT-模型视图之自定义委托

Qt OpenGL 数据同步/模型/视图实现

QT 模型/视图 编程 委托篇

Qt View/Model/Data Paradigm:如何修改数据?

Qt 嵌套模型视图