【问题标题】:Modifying data representation in Qt model/view在 Qt 模型/视图中修改数据表示
【发布时间】:2016-02-28 08:00:26
【问题描述】:

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

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

【问题讨论】:

    标签: qt cell qtableview qsqltablemodel


    【解决方案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));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多