我有一个 QTableView
使用 QSqlTableModel
显示一个表。
在该表中,我有一个 DATETIME 列。当我添加一行并尝试编辑时
那个专栏,我有一个简单的 QEdit。我想在那里有一个 QDateTimeEdit
(或类似的),正确编辑该字段会容易得多。
据我了解文档,它应该自己工作,默认委托(delegate)应该能够处理 QDateTime
并放置一个 QDateTimeEdit
,所以我猜 QSqlTableModel
没有将它识别为日期,因为表是空的。有没有一种简单的方法可以指定它是一个日期而不仅仅是文本?
我现在使用 SQlite 作为数据库,我不知道这是否是问题所在?
我不知道我可以在此处粘贴哪一段相关的代码,它实际上只是一个 QSqlTableModel::setTable
和一个 QTableView::setModel
,没什么。
最佳答案
SQLite 使用动态类型系统,即它没有数据类型。您应该实现自定义委托(delegate)并手动设置它。
QDateTimeEdit 的自定义委托(delegate):
#include <QItemDelegate>
#include <QDateTimeEdit>
class DateTimeEditDelegate: public QItemDelegate
{
Q_OBJECT
public:
DateTimeEditDelegate(QObject *parent = 0);
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 ):QItemDelegate(parent)
{
}
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);
}
您可以将委托(delegate)实例设置为列:
ui->tableView->setItemDelegateForColumn(0, new DateTimeEditDelegate(ui->tableView));
关于c++ - QSqlTableModel 和 DATETIME 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734550/