Querymodel editierbar generell - Änderungen in DB speichern

Alles rund um die Programmierung mit Qt
Antworten
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Querymodel editierbar generell - Änderungen in DB speichern

Beitrag 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
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Querymodel editierbar generell - Änderungen in DB speichern

Beitrag 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
Die Sprache des Technikers ist die Skizze
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

Re: Querymodel editierbar generell - Änderungen in DB speichern

Beitrag von Chri »

Hi

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

LG
Chri
Die Sprache des Technikers ist die Skizze
Antworten