QSQLTableModel: delegate failed to update data



  • I'm currently using QSQLTableModel and QTableView with custom delegates. One delegate with a combobox and one with a dateedit but i can not successfully transfer changes made in the delegates to the sql table.
    one delegate:
    SQLDateDelegate.hpp
    @#ifndef SQLDATE_DELEGATE_HPP__INCLUDED
    #define SQLDATE_DELEGATE_HPP__INCLUDED

    #pragma once

    #include <QtWidgets\QStyledItemDelegate>

    class SQLDateDelegate : public QStyledItemDelegate
    {
    Q_OBJECT

    public:
    SQLDateDelegate(QWidget* parent = NULL);

    QWidget* createEditor(QWidget* parent, QStyleOptionViewItem const& option, QModelIndex const& index) const;
    void setEditorData(QWidget* editor, QModelIndex const& index) const;
    void setModelData(QWidgeteditor, QAbstractItemModel model, QModelIndex const& index) const;
    void updateEditorGeometry(QWidget* editor, QStyleOptionViewItem const& option, QModelIndex const& index ) const;
    void paint(QPainter* painter, QStyleOptionViewItem const& option, QModelIndex const& index) const;
    };

    #endif // SQLDATE_DELEGATE_HPP__INCLUDED@
    SQLDateDelegate.cpp
    @#include "SQLDateDelegate.hpp"
    #include <QtWidgets\QDateTimeEdit>
    #include <QtWidgets\QApplication>

    SQLDateDelegate::SQLDateDelegate(QWidget* parent)
    : QStyledItemDelegate(parent)
    {}

    QWidget* SQLDateDelegate::createEditor(QWidget* parent, QStyleOptionViewItem const& option, QModelIndex const& index) const
    {
    QDateEdit* editor(new QDateEdit(parent));
    editor->setCalendarPopup(true);
    editor->setDisplayFormat("dd.MM.yyyy");
    return editor;
    }

    void SQLDateDelegate::setEditorData(QWidget* editor, QModelIndex const& index) const
    {
    QDateEdit* edit = qobject_cast<QDateEdit*>(editor);
    if (!edit) return;
    edit->setDate(QDate::fromString(index.data(Qt::EditRole).toString(), Qt::ISODate));
    }

    void SQLDateDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, QModelIndex const& index) const
    {
    QDateEdit* edit = qobject_cast<QDateEdit*>(editor);
    if (!edit) return;
    // update to latest input
    edit->interpretText();
    model->setData(index, edit->date().toString(Qt::ISODate)/, Qt::EditRole/);
    }

    void SQLDateDelegate::updateEditorGeometry(QWidget* editor, QStyleOptionViewItem const& option, QModelIndex const& index) const
    {
    editor->setGeometry(option.rect);
    }

    void SQLDateDelegate::paint(QPainter* painter, QStyleOptionViewItem const& option, QModelIndex const& index) const
    {
    QStyleOptionViewItemV4 display_option(option);
    display_option.text = QDate::fromString(index.data().toString(), Qt::ISODate).toString("dd.MM.yyyy");
    QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &display_option, painter);
    }@

    assigning model to view
    @QTableView& view (*m_userinterface.table);
    m_model = new QSqlTableModel(&view);
    m_model->setTable("dataset");
    m_model->setEditStrategy(QSqlTableModel::OnFieldChange);
    m_model->select();
    view.setModel(m_model);
    view.setItemDelegateForColumn(1, new SQLDateDelegate(&view));
    @

    Pressing [Enter] or changing row close the QDateEdit but the data is not transfered into the (dataset-)Table. After editing is finishied in addition the row is displayed empty (in all columns)

    I hope someone knows the solution? :)

    Sry for my bad english skills :(



  • The solution is realy simple but costs me a lot of time. lastError is an empty string but the Problem was that i was not inserting a valid entry to the database.

    i did not show in the above example that i was using removeColumn (QSqlTableModel) which made the strange behaviour. Using setColumnHidden (QTableView) fixed the error.



  • Could you, please, prepend [Solved] to the title of your post so that others know?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.