2016-02-28 97 views
0

我正在使用Qt 5.4.2,并且在填充模型视图时如何更改数据“表示形式”时遇到问题。我有一个QSqlTableModel来存放数据库数据和一个显示数据库内容的QTableView。修改Qt模型/视图中的数据表示形式

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

回答

0

您应该为特定列实现自定义委托并手动进行设置。简单地实现从0​​衍生像类:

#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)); 

它只是沿着自定义数据实现自定义数据表示为代表的样本编辑。你应该根据自己的需求来实现你自己。