QSqlTableModel and DATETIME columns

QSqlTableModel and DATETIME columns

本文关键字:columns DATETIME and QSqlTableModel      更新时间:2023-10-16

我有一个使用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));来使用它。我仍然不时遇到一些奇怪的问题,比如随机单元格会获取我正在编辑的单元格的值,我试图找出原因。