繁体   English   中英

在Qt模型/视图中修改数据表示

[英]Modifying data representation in Qt model/view

我正在使用Qt 5.4.2,在尝试找出从模型填充视图时如何更改数据“表示形式”时遇到了麻烦。 我有一个QSqlTableModel来保存数据库数据,还有一个QTableView正在显示数据库的内容。

现在,数据库中的某些数据的格式与我希望在View中显示的格式不同。 例如,我想以不同的方式显示日期格式,但是我不知道在哪里/如何实现这种逻辑。 我不希望模型受到任何影响,仅希望视图中显示的数据受到影响。

您应该为特定列实现自定义委托,并手动进行设置。 只需实现从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));

这只是一个代表的示例,该代表在自定义数据编辑中实现了自定义数据表示。 您应该根据自己的需要实施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM