QSqlTableModel and DATETIME columns
QSqlTableModel and DATETIME columns
我有一个使用QSqlTableModel
显示表格的QTableView
。在该表中,我有一个 DATETIME 列。当我添加一行并尝试编辑时那个专栏,我有一个简单的QEdit。我想在那里有一个QDateTimeEdit
(或类似),正确编辑该字段会容易得多。
据我了解文档,它应该可以自己工作,默认委托应该能够处理QDateTime
并放置一个QDateTimeEdit
,所以我想QSqlTableModel
没有将其识别为日期,因为表是空的。有没有一种简单的方法可以指定它是一个日期而不仅仅是文本?
我现在正在使用SQlite作为数据库,我不知道这是否是问题所在?我不知道我可以在这里粘贴哪段相关的代码,它实际上只是一个QSqlTableModel::setTable
和一个QTableView::setModel
,没什么。
SQLite使用动态类型系统,即它没有数据类型。应实现自定义委托并手动设置它。
QDateTimeEdit的自定义委托:
#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);
}
可以将委托的实例设置为列:
ui->tableView->setItemDelegateForColumn(0, new DateTimeEditDelegate(ui->tableView));
设法通过
实现委托来解决这个问题。如果有一天有人需要它,就有代码。
#ifndef DATEDELEGATE_HH__
# define DATEDELEGATE_HH__
# include <QItemDelegate>
# include <QDateTimeEdit>
class DateDelegate : public QItemDelegate
{
public:
DateDelegate(QWidget *parent = 0);
virtual ~DateDelegate(void);
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;
};
#endif
'
#include "DateDelegate.hh"
DateDelegate::DateDelegate(QWidget *parent)
: QItemDelegate(parent)
{
}
DateDelegate::~DateDelegate(void)
{
}
QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
QDateTimeEdit *editor = new QDateTimeEdit(parent);
editor->setCalendarPopup(true);
editor->setDateTime(QDateTime::fromString(index.data().toString(), "dd/MM/yyyy hh:mm:ss"));
editor->setDisplayFormat("dd/mm/yyyy");
return (editor);
}
void DateDelegate::setEditorData(QWidget *paramEditor, const QModelIndex &index) const
{
QDateTimeEdit *editor = static_cast<QDateTimeEdit *>(paramEditor);
editor->setDateTime(QDateTime::fromString(index.data().toString(), "dd/MM/yyyy hh:mm:ss"));
}
void DateDelegate::setModelData(QWidget *paramEditor, QAbstractItemModel *model, const QModelIndex& index) const
{
QDateTimeEdit *editor = static_cast<QDateTimeEdit *>(paramEditor);
model->setData(index, editor->dateTime().toString("dd/MM/yyyy hh:mm:ss"));
}
然后我就用this->ui->tableView->setItemDelegateForColumn(4, new DateDelegate(this->ui->tableView));
来使用它。我仍然不时遇到一些奇怪的问题,比如随机单元格会获取我正在编辑的单元格的值,我试图找出原因。
相关文章:
- 如何计算文件中的"columns"数?
- 如何在MySQL Connector/C++ 8.0中使用DATETIME?
- 如何使用xdevapi从mysql获取DateTime
- 使用Strftime格式化DateTime
- 从c++11 time_t创建一个可转换为.net DateTime的字符串
- magick 对magick :: image :: columns的未定义引用
- 将DateTime字符串分为C 的日期时间
- 仅使用boost.datetime在Windows上有错误
- 如何使用mySQL连接器/C 获取DateTime并将其存储到TIME_T
- QT获取DateTime的JPEG EXIF元数据
- DateTime,字符串比较
- 如何在Boost::DateTime中强制执行严格的解析
- 在C++中获取mySQL DATETIME值
- 如何在现代C 中转换为DateTime
- 将MySQL DateTime转换为C STD :: TIME_T
- 将矩阵传递给函数。 "invalid conversion from 'int (*)[columns]' to 'int' [-fpermissive]"
- 系统:: DateTime返回1/1/1 00:00:00的值
- MonetDB create 100.000 columns
- hbase thrift2 TGet.columns不起作用
- QSqlTableModel and DATETIME columns