0
我正在使用Qt 5.4.2,並且在填充模型視圖時如何更改數據「表示形式」時遇到問題。我有一個QSqlTableModel來存放數據庫數據和一個顯示數據庫內容的QTableView。修改Qt模型/視圖中的數據表示形式
現在數據庫中的一些數據與我想在視圖中顯示的格式不同。例如,我想以不同的方式顯示日期格式,但我不知道在何處/如何實現此類邏輯。我不希望模型受到任何影響,只有視圖中顯示的數據。
我正在使用Qt 5.4.2,並且在填充模型視圖時如何更改數據「表示形式」時遇到問題。我有一個QSqlTableModel來存放數據庫數據和一個顯示數據庫內容的QTableView。修改Qt模型/視圖中的數據表示形式
現在數據庫中的一些數據與我想在視圖中顯示的格式不同。例如,我想以不同的方式顯示日期格式,但我不知道在何處/如何實現此類邏輯。我不希望模型受到任何影響,只有視圖中顯示的數據。
您應該爲特定列實現自定義委託並手動進行設置。簡單地實現從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));
它只是沿着自定義數據實現自定義數據表示爲代表的樣本編輯。你應該根據自己的需求來實現你自己。