QSqlQueryModel reference error in roleName for ListView QML

萝らか妹 提交于 2019-12-13 03:45:33

问题


I want to get the model from my SQlite Database, when I set the query in the QSqlQueryModel I can get the number of rows, number of columns, etc. But the data inside each column I have a ReferenceError trying to get the name of the column The cpp code:

//data base users
QSqlQueryModel *sqlModel = new QSqlQueryModel();
sqlModel->setQuery("SELECT usuarios.nombre FROM usuarios");

sqlModel->setHeaderData(0,Qt::Horizontal, QObject::tr("nombre"));
qDebug() << "ROL: " << sqlModel->roleNames();
qDebug() << "number of rows: " << sqlModel->rowCount();
qDebug() << "number of columns: " << sqlModel->columnCount();
qDebug() << "HEADER: " << sqlModel->headerData(1, Qt::Horizontal).toString();

And this is what I get from the output

This is what I have in my ListView in QML:

ListView {
             id: listaUsuarios
             model: sqlModel
            delegate:
            Text{
                anchors.fill: parent
                text: nombre
             }
        }

回答1:


How to observe the fields of the table are not roles, so they can not be accessed from QML, so to be accessed, the name of the fields must be added as a role, for this the class must be overwritten:

class SqlQueryModel: public QSqlQueryModel{
public:
    using QSqlQueryModel::QSqlQueryModel;
    QVariant data(const QModelIndex &index, int role) const
    {
        QVariant value;
        if (index.isValid()) {
            if (role < Qt::UserRole) {
                value = QSqlQueryModel::data(index, role);
            } else {
                int columnIdx = role - Qt::UserRole - 1;
                QModelIndex modelIndex = this->index(index.row(), columnIdx);
                value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
            }
        }
        return value;
    }
    QHash<int, QByteArray> roleNames() const
    {
        QHash<int, QByteArray> roles = QSqlQueryModel::roleNames();
        for (int i = 0; i < this->record().count(); i ++) {
            roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
        }
        return roles;
    }
};

Example:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QDebug>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        qDebug()<<"Unable to establish a database connection.\n"
                  "This example needs SQLite support. Please read "
                  "the Qt SQL driver documentation for information how "
                  "to build it.\n\n"
                  "Click Cancel to exit.";
        return false;
    }

    QSqlQuery query;
    query.exec("create table usuarios (ID INTEGER PRIMARY KEY AUTOINCREMENT, "
               "nombre VARCHAR(20), apellido VARCHAR(20))");
    query.exec("insert into usuarios values(1, 'Danny', 'Young')");
    query.exec("insert into usuarios values(2, 'Christine', 'Holand')");
    query.exec("insert into usuarios values(3, 'Lars', 'Gordon')");
    query.exec("insert into usuarios values(4, 'Roberto', 'Robitaille')");
    query.exec("insert into usuarios values(5, 'Maria', 'Papadopoulos')");
    return true;
}

class SqlQueryModel: public QSqlQueryModel{
public:
    using QSqlQueryModel::QSqlQueryModel;
    QVariant data(const QModelIndex &index, int role) const
    {
        QVariant value;
        if (index.isValid()) {
            if (role < Qt::UserRole) {
                value = QSqlQueryModel::data(index, role);
            } else {
                int columnIdx = role - Qt::UserRole - 1;
                QModelIndex modelIndex = this->index(index.row(), columnIdx);
                value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
            }
        }
        return value;
    }
    QHash<int, QByteArray> roleNames() const
    {
        QHash<int, QByteArray> roles = QSqlQueryModel::roleNames();
        for (int i = 0; i < this->record().count(); i ++) {
            roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
        }
        return roles;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    if(!createConnection())
        return -1;

    SqlQueryModel sqlModel;
    sqlModel.setQuery("SELECT usuarios.nombre FROM usuarios");
    qDebug() << sqlModel.roleNames();

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("sqlModel", &sqlModel);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

Output:



来源:https://stackoverflow.com/questions/50021702/qsqlquerymodel-reference-error-in-rolename-for-listview-qml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!