簡體   English   中英

QML TableView + PostgreSQL數據庫錯誤

[英]QML TableView + PostgreSQL database error

我有posrgresql數據庫,需要在TableView中顯示數據,但出現錯誤“ ... / Qt5.5.1 / 5.5 / gcc_64 / qml / QtQuick / Controls / Private / BasicTableView.qml:516:無法分配[ undefined]為int”

它將重定向到BasicTableView.qml:

rowItem.rowIndex = Qt.binding( function() { return model.index });

問題就在這里。

據我了解,由於某種未知原因,它可以為行設置索引。 我以為是TableView問題,但是當我嘗試打開sqlite數據庫時,沒關系。 我以為是postgres問題,但是當我在ListView中顯示數據時,就可以了。

那就是問題所在:

Sqlite + TableView =確定;

Postgres + ListView =確定;

Postgres + TableView =錯誤。

我嘗試重新安裝Qt,甚至重新安裝Kubuntu,但問題仍然存在。

這是我的代碼:

main.cpp中

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSqlDatabase>
#include <QSqlQueryModel>
#include <QSqlQuery>
#include <QDebug>
#include <QQuickView>
#include <QQmlContext>
#include <QSqlTableModel>
#include <QString>

#include "customsqlmodel.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQuickView view;

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("127.0.0.1");
    db.setDatabaseName("stores");
    db.setUserName("postgres");
    db.setPassword("11111111");
    bool ok = db.open();

    CustomSqlModel *model = new CustomSqlModel();
    model->setQuery("select * from product");

    view.rootContext()->setContextProperty("lolmodel", model);
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    QSqlQuery query;   

    return app.exec();
}

customsqlmodel.h

#pragma once

#include <QSqlQueryModel>
#include <QVariant>  

class CustomSqlModel : public QSqlQueryModel
{
    Q_OBJECT

public:
    explicit CustomSqlModel(QObject *parent = 0);

    void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase());
    void setQuery(const QSqlQuery &query);
    QVariant data(const QModelIndex &index, int role) const;
    QHash<int, QByteArray> roleNames() const {  return m_roleNames; }

private:
    void generateRoleNames();
    QHash<int, QByteArray> m_roleNames;
};

customsqlmodel.cpp

#include "customsqlmodel.h"

#include <QSqlRecord>
#include <QSqlQuery>

CustomSqlModel::CustomSqlModel(QObject *parent) :
    QSqlQueryModel(parent)
{

}

void CustomSqlModel::setQuery(const QString &query, const QSqlDatabase &db)
{
    QSqlQueryModel::setQuery(query, db);
    generateRoleNames();
}

void CustomSqlModel::setQuery(const QSqlQuery & query)
{
    QSqlQueryModel::setQuery(query);
    generateRoleNames();
}

void CustomSqlModel::generateRoleNames()
{
    m_roleNames.clear();
    for(int i = 0; i < record().count(); i ++) {
        m_roleNames.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
    }
}

QVariant CustomSqlModel::data(const QModelIndex &index, int role) const
{
    QVariant value;

    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;
}

main.qml

import QtQuick 2.3
import QtQuick.Controls 1.4

Rectangle {
    visible: true
    width: 800
    height: 600

    Rectangle {
        id: root
        anchors.fill: parent

        TableView {
            id: studentView
            anchors {
                top: parent.top
                left: parent.left
                right: parent.right
                bottom: parent.bottom

                bottomMargin: 100
            }
            model: lolmodel

            TableViewColumn {
                role: "manufacturer"
                title: "manufacturer"
            }
            TableViewColumn {
                role: "model"
                title: "model"
            }
            TableViewColumn {
                role: "guarantee"
                title: "guarantee"
            }
        }
    }
}

使這種情況發生的原因是角色“模型”。 您必須重命名。

我想它與視圖的真實模型有些混亂...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM