c++ - QML TableView + PostgreSQL 数据库报错

标签 c++ postgresql sqlite qml

我有 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 = ok;

Postgres + ListView = 确定;

Postgres + TableView = 错误。

我试过重装Qt,甚至重装Kubuntu,问题依旧。

这是我的代码:

主要.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();
}

自定义sql模型.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;
};

自定义sql模型.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;
}

主.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"
            }
        }
    }
}

最佳答案

正是“榜样”这个角色促成了这一切。 您必须重命名它。

我想它在某处与 View 的真实模型混淆了...

关于c++ - QML TableView + PostgreSQL 数据库报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34625030/

相关文章:

sql - 使用jq创建SQL INSERT语句将多级JSON数组导入RDMS

python - 要快速从 Python 数组转换为 PostgreSQL?

r - 如何快速将数据导入h2o

java - sqlite数据库android将所有列值放入字符串数组

c++ - RHEL 6.0 两段相似的代码 : One Compiles One Does Not

c++ - 确定景观中所有点与具有特定属性的点的距离的最快方法

c++ - 如何使Windows Timer在后台线程中运行

sql - Postgres 删除表语法错误

python - 如何使用 Flask/SqlAlchemy/SQLite 对过去 7 天的每一天的数据库记录进行分组?

c++检查函数在运行时是否重载