我有一个使用QSqlTableModel显示表的QTableView。在该表中,我有一个DATETIME列。当我添加一行并试图编辑该列时,我得到了一个简单的QEdit。我希望有一个QDateTimeEdit (或类似)在那里,这将是更容易编辑该字段正确。
根据我对文档的理解,它应该自己工作,默认委托应该能够处理QDateTime并放置一个QDateTimeEdit,所以我猜QSqlTableModel不会将其识别为日期,因为表是空的。有没有一种简单的方法来指定它是一个日期而不仅仅是文本?
我现在使用SQlite作为数据库,我不知道这是否可能是问题所在?我不知道我可以在这里粘贴的哪段代码是相关的,它实际上只是一个QSqlTableModel::setTable和一个QTableView::setModel,没什么。
发布于 2014-03-30 03:02:36
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));发布于 2014-03-30 18:07:02
通过实现一个委派来解决这个问题。如果有一天有人需要它,这里有代码。
#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));来使用它。我仍然时不时会遇到一些奇怪的问题,比如一个随机的单元格会取我正在编辑的单元格的值,我正在试图找出原因。
https://stackoverflow.com/questions/22734550
复制相似问题