【问题标题】:QSqlTableModel and DATETIME columnsQSqlTableModel 和 DATETIME 列
【发布时间】:2014-03-29 17:45:18
【问题描述】:

我有一个QTableView 使用QSqlTableModel 显示一个表格。 在该表中,我有一个 DATETIME 列。当我添加一行并尝试编辑时 那个专栏,我有一个简单的QEdit。我想在那里有一个QDateTimeEdit(或类似的),正确编辑该字段会容易得多。

据我了解文档,它应该可以自己工作,默认委托应该能够处理 QDateTime 并放置 QDateTimeEdit,所以我猜 QSqlTableModel 没有将其识别为日期,因为桌子是空的。有没有一种简单的方法来指定它是一个日期而不仅仅是文本?

我现在使用 SQlite 作为数据库,我不知道这是否是问题所在? 我不知道我可以在这里粘贴什么相关的代码,它实际上只是一个QSqlTableModel::setTable 和一个QTableView::setModel,没什么。

【问题讨论】:

    标签: c++ qt sqlite qt4 qsqltablemodel


    【解决方案1】:

    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));
    

    【讨论】:

    • 那行不通,setItemDelegateForColumn 需要一个 QAbstractItemDelegate,所以我想我必须以某种方式重新实现它
    • 它适用于一个单元格,我想如果一次为一个项目设置代表它会正常工作。谢谢,我为 setItemDelegateForColumn 创建了自己的委托
    【解决方案2】:

    通过实施委托来解决这个问题。 如果有一天有人需要,这里有代码。

    #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-&gt;ui-&gt;tableView-&gt;setItemDelegateForColumn(4, new DateDelegate(this-&gt;ui-&gt;tableView)); 来使用吧。 我仍然不时遇到一些奇怪的问题,比如一个随机单元格会占用我正在编辑的单元格的值,我正在尝试找出原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多