首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子类QSqlTableModel插入新值

子类QSqlTableModel插入新值
EN

Stack Overflow用户
提问于 2016-09-08 20:05:46
回答 1查看 2.3K关注 0票数 1

我想在中显示来自本地db-File的SQL数据,而不是对sql-数据库进行一些编辑。大约三周后,我做了什么:在中显示我的数据。我不确定是否真的需要子类QSqlTableModel,如果子类根本不需要的话,我肯定会很高兴。

在我的main.cpp中,下面应该创建我的模型并直接添加一个记录。

代码语言:javascript
运行
复制
    // Create an instance of the SqlModel for accessing the data
    SqlDataModel *sqlModel;
    sqlModel = new SqlDataModel(0,base.database());
    sqlModel->setTable("diaBaneDatabase");
    sqlModel->setSort(0, Qt::AscendingOrder);
    sqlModel->setEditStrategy(QSqlTableModel::OnFieldChange);

    sqlModel->select();


    QSqlRecord record(sqlModel->record());
    record.setValue(0,50);
    record.setValue(3,222);
    sqlModel->insertRecord(-1, record);
    sqlModel->submitAll();

这应将222增加到第4栏。但是我的sqlDatabase里什么都不会存储

我的SqlDataModel::setData loolks如下所示:

代码语言:javascript
运行
复制
    bool SqlDataModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        qDebug() << index.column() << "   " << index.row() << "   " << value << "   ----  " << role;


        qDebug() << roles[Qt::UserRole + 1];

        //qDebug() << QSqlTableModel::setData(modelIndex, value);

       qDebug() << QSqlQueryModel::setData(index, value);
        return false;

    }

产出如下:

代码语言:javascript
运行
复制
    0     39     QVariant(int, 50)    ----   2
    "id"
    false
    1     39     QVariant(QString, "")    ----   2
    "id"
    false
    2     39     QVariant(QString, "")    ----   2
    "id"
    false
    3     39     QVariant(int, 222)    ----   2
    "id"
    false
    4     39     QVariant(double, 0)    ----   2
    "id"
    false
    5     39     QVariant(int, 0)    ----   2
    "id"
    false
    6     39     QVariant(double, 0)    ----   2
    "id"
    false
    7     39     QVariant(double, 0)    ----   2
    "id"
    false

当然,我的setData方法是错误的,但是我不知道应该发生什么,我也没有找到任何例子。

我的假设是,我需要子类QSqlTableModel才能将模型通过QQmlContext传递到QML,而不是显示具有类似于我的列名的角色的列,这是不是我错了?如果不是,如何将第1列的内容放到QMLTableview中:

代码语言:javascript
运行
复制
        TableViewColumn {
            role: "id" // what should be the role if I don't subclass???
            title: "ID"
            width: 80
        }

我很高兴能得到任何帮助,评论,例如,其他的帖子或者其他的东西让我更进一步.谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-10 00:03:25

我一直在做一个例子。

一些注意事项:

  • TableView这样的QML项目需要一个模型,所以我认为QSqlTableModel是一个很好的选择。当然,可以用来处理数据项的你还有其他模特
  • 在类MySqlTableModel中,您将看到所需的角色名称。MySqlTableModel重新实现roleNames()来公开角色名称,以便可以通过QML访问它们。
  • 您可以在setData中重新实现MySqlTableModel方法,但我认为最好使用QSqlTableModel提供的方法insertRecord

我希望这个例子能帮助你修正你的错误。

main.cpp

代码语言:javascript
运行
复制
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "mysqltablemodel.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydb");

    if(!db.open()) {
        qDebug() << db.lastError().text();
        return 0;
    }

    QSqlQuery query(db);

    if(!query.exec("DROP TABLE IF EXISTS mytable")) {
        qDebug() << "create table error: " << query.lastError().text();
        return 0;
    }

    if(!query.exec("CREATE TABLE IF NOT EXISTS mytable \
                   (id integer primary key autoincrement, name varchar(15), salary integer)")) {
        qDebug() << "create table error: " << query.lastError().text();
        return 0;
    }

    MySqlTableModel *model = new MySqlTableModel(0, db);
    model->setTable("mytable");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();

    QSqlRecord rec = model->record();
    rec.setValue(1, "peter");
    rec.setValue(2, 100);
    model->insertRecord(-1, rec);
    rec.setValue(1, "luke");
    rec.setValue(2, 200);
    model->insertRecord(-1, rec);

    if(model->submitAll()) {
        model->database().commit();
    } else {
        model->database().rollback();
        qDebug() << "database error: " << model->lastError().text();
    }

    QQmlApplicationEngine engine;

    QQmlContext *ctxt = engine.rootContext();
    ctxt->setContextProperty("myModel", model);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

mysqltablemodel.h

代码语言:javascript
运行
复制
#ifndef MYSQLTABLEMODEL_H
#define MYSQLTABLEMODEL_H

#include <QSqlTableModel>
#include <QSqlRecord>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>

class MySqlTableModel : public QSqlTableModel
{
    Q_OBJECT

public:
    MySqlTableModel(QObject *parent = 0, QSqlDatabase db = QSqlDatabase());
    Q_INVOKABLE QVariant data(const QModelIndex &index, int role=Qt::DisplayRole ) const;
    Q_INVOKABLE void addItem(const QString &name, const QString &salary);

protected:
    QHash<int, QByteArray> roleNames() const;

private:
    QHash<int, QByteArray> roles;
};

#endif // MYSQLTABLEMODEL_H

mysqltablemodel.cpp

代码语言:javascript
运行
复制
#include "mysqltablemodel.h"

MySqlTableModel::MySqlTableModel(QObject *parent, QSqlDatabase db): QSqlTableModel(parent, db) {}

QVariant MySqlTableModel::data ( const QModelIndex & index, int role ) const
{
    if(index.row() >= rowCount()) {
        return QString("");
    }
    if(role < Qt::UserRole) {
        return QSqlQueryModel::data(index, role);
    }
    else {
        return QSqlQueryModel::data(this->index(index.row(), role - Qt::UserRole), Qt::DisplayRole);
    }
}

QHash<int, QByteArray> MySqlTableModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[Qt::UserRole + 1] = "name";
    roles[Qt::UserRole + 2] = "salary";
    return roles;
}

void MySqlTableModel::addItem(const QString &name, const QString &salary)
{
    QSqlRecord rec = this->record();
    rec.setValue(1, name);
    rec.setValue(2, salary.toInt());
    this->insertRecord(-1, rec);

    if(this->submitAll()) {
        this->database().commit();
    } else {
        this->database().rollback();
        qDebug() << "database error: " << this->lastError().text();
    }
}

main.qml

代码语言:javascript
运行
复制
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
    visible: true

    TableView {
        id: tableView

        anchors.fill: parent

        TableViewColumn {
            role: "name"
            title: "Name"
            width: 200
        }

        TableViewColumn {
            role: "salary"
            title: "Salary"
            width: 200
        }

        model: myModel
    }

    Button {
        id: addButton

        anchors.verticalCenter: parent.verticalCenter

        text: "Add item"

        onClicked: {
            if (nameBox.text || salaryBox.text) {
                myModel.addItem(nameBox.text, salaryBox.text)
            }
        }
    }
    TextField {
        id: nameBox
        placeholderText: "name"

        anchors.verticalCenter: parent.verticalCenter
        anchors.left: addButton.right
        anchors.leftMargin: 5
    }

    TextField {
        id: salaryBox
        placeholderText: "salary"

        anchors.verticalCenter: parent.verticalCenter
        anchors.left: nameBox.right
        anchors.leftMargin: 5
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39399340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档