QML TableView+PostgreSQL数据库错误
QML TableView + PostgreSQL database error
我有posrgresql数据库,我需要在TableView中显示数据,但我收到一个错误"…/Qt5.5.1/5.5/gcc_64/qml/QtQuick/Controls/Private/BasicTableView.qml:516:无法为每行将[未定义]分配给int"。
它重定向到BasicTableView.qml:
rowItem.rowIndex = Qt.binding( function() { return model.index });
问题就在这里。
据我所知,出于某种未知的原因,它可以为行设置索引。我想,这是TableView的问题,但当我尝试打开sqlite数据库时,它是可以的。我想,它是postgres的问题,但是当我在ListView中显示数据时,它可以的。
这就是问题所在:
Sqlite+TableView=可以;
Postgres+ListView=ok;
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"
}
}
}
}
正是角色"模型"实现了这一点。你必须重命名它。
我想它在某种程度上与真实的视图模型相混淆。。。
相关文章:
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 以只读模式打开数据库时SQLITE_CANTOPEN错误
- 【MacOSX 10.15.1】使用 odb 生成数据库,致命错误:wchar.h:没有这样的文件或目录 #include < wchar.h>
- QT 数据库模块错误
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- Qt & SqlLite - 错误的数据库路径
- 在CodeBlocks上编译C 中的Oracle数据库环境时的错误
- 数据库未打开错误QT C
- CDao数据库断言错误
- ODBC 错误"String data, right truncation State code: 22001"与 SQL Server 数据库
- 几个使用相同原型的共享对象导致错误:数据库中已经存在文件
- Qt 5.4,数据库未打开错误
- 使用C++从MySQL数据库获取字符串时编码错误
- 为什么我得到错误C1033:无法打开VS 2010中的程序数据库
- 使用SOCI从PostgreSQL数据库获取数据时发生错误转换
- SQLite删除数据库错误
- Sybase DB 错误:数据库驱动程序错误.发送失败
- 在 sqlite 数据库 qt 之间复制表会导致错误
- 将数据从qt插入postgres数据库错误