c++ - QSqlTableModel 和 DATETIME 列

标签 c++ qt sqlite qt4 qsqltablemodel

我有一个 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/

相关文章:

c++ - 体系结构 x86_64 的 undefined symbol (C++ 继承问题)

c++ - 如何在一些类之间共享不同的对象

c++ - Qt5:如何使用 State 正确设置 ProgressBar

c++ - 插入 SQLite 时如何处理逗号和撇号字符

java - 将 SQLite 数据库备份到外部存储 - 文件引用错误

java - 创建 TableLayout 并从另一个类调用它 - Android

指向对象 vector 的 C++ 指针,需要访问属性

c++ - std::char_traits::assign() 的目的是什么?

c++ - QT的opengl问题

android - 我什么时候应该使用装载机?什么时候异步任务? (安卓)