Seite 1 von 1

Querymodel editierbar generell - Änderungen in DB speichern

Verfasst: 4. Oktober 2020 14:37
von Chri
Hi

Was funktioniert: Ich kann die TableView bearbeiten.

Was nicht funktioniert:
Wenn ich die Eingabe in einer Zelle beende, ist die TableView leer
und
Neues Hineinladen nützt nichts, da die Änderungen nicht in der DB gespeichert werden.

Code: Alles auswählen

class EditableQuerylModel : public QSqlQueryModel
{
    Q_OBJECT

public:
    EditableQuerylModel(QObject *parent = nullptr) : QSqlQueryModel(parent) {};

    Qt::ItemFlags flags(
            const QModelIndex &index) const
    {
        Qt::ItemFlags flags = QSqlQueryModel::flags(index);
        flags |= Qt::ItemIsEditable;
        return flags;
    }

    bool setData(const QModelIndex &index, const QVariant &value, int /* role */)
    {

        QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
        int id = data(primaryKeyIndex).toInt();
//????????????????????

       return //???????????;
};

Was fehlt noch?
(Habe natürlich alles Mögliche ausprobiert, erfolglos, deswegen nur der Code, der funktioniert.
Und im Internet findet man immer nur das gleiche (spezielle) Beispiel, in allen möglichen Sprachen, hat mir aber nicht weiter geholfen
)


LG
chri

Re: Querymodel editierbar generell - Änderungen in DB speichern

Verfasst: 6. Oktober 2020 08:48
von Chri
Ok.
Das hier funktioniert:

Code: Alles auswählen

class EditableQuerylModel : public QSqlQueryModel
{
    Q_OBJECT

public:
    EditableQuerylModel(QObject *parent = nullptr) : QSqlQueryModel(parent) {};

    Qt::ItemFlags flags(
            const QModelIndex &index) const
    {
        Qt::ItemFlags flags = QSqlQueryModel::flags(index);
        flags |= Qt::ItemIsEditable;
        return flags;
    }

    bool setData(const QModelIndex &index, const QVariant &value, int /* role */)
    {
        QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
        int id = data(primaryKeyIndex).toInt();
	QSqlQuery qAlt =   QSqlQueryModel::query();
	QSqlQueryModel::setData(index,value,Qt::EditRole);

	QString aktcol = QSqlQueryModel::headerData( index.column(), Qt::Horizontal ).toString(); //Spaltenname
	QString sqltext = ("UPDATE Geo_Direkt SET " + aktcol + "= :value WHERE FL_ID = :FL_ID");

	QSqlQuery query;
	query.prepare(sqltext);

	query.bindValue(":value", value);
	query.bindValue(":FL_ID", id);

	query.exec();
	return qAlt.exec();  //Sonst wird die View nicht aktualisiert

    }

Verbesserungen?
Würde noch gern den konkreten Tabellennamen aus sqltext raushaben. Wie bekomme ich den aktuellen Tabellennamen?


LG
Chri

Re: Querymodel editierbar generell - Änderungen in DB speichern

Verfasst: 14. Oktober 2020 14:34
von Chri
Hi

Kann man im QSqlQueryModel eine Combobox als Editor verwenden?
Diesbezügliche Versuche im Delegate haben nicht funktioniert.

LG
Chri