QSqlQueryModel reference error in roleName for ListView QML

前端 未结 1 1500
灰色年华
灰色年华 2020-12-12 03:11

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 co

相关标签:
1条回答
  • 2020-12-12 03:40

    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:

    0 讨论(0)
提交回复
热议问题