Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QtQuick TableView和QSqlTableModel不工作_Sql_Qt_Qml - Fatal编程技术网

QtQuick TableView和QSqlTableModel不工作

QtQuick TableView和QSqlTableModel不工作,sql,qt,qml,Sql,Qt,Qml,我正在尝试实现一个QML程序来查看数据库中的数据。我使用QSqlTableModel作为模型,使用TableView进行可视化。关键是TableView根本不调用数据函数,所以我只看到一堆空行,它能够正确计算模型中的行数。正如您将在下面看到的,当与QTableView一起使用时,该模型可以完美地工作。所以重点是TableView根本不调用数据 这是代码。QML: import QtQuick 2.6 import QtQuick.Controls 1.5 ApplicationWindow {

我正在尝试实现一个QML程序来查看数据库中的数据。我使用QSqlTableModel作为模型,使用TableView进行可视化。关键是TableView根本不调用数据函数,所以我只看到一堆空行,它能够正确计算模型中的行数。正如您将在下面看到的,当与QTableView一起使用时,该模型可以完美地工作。所以重点是TableView根本不调用数据

这是代码。QML:

import QtQuick 2.6
import QtQuick.Controls 1.5

ApplicationWindow {
    id: root
    visible: true
    width: 1024
    height: 640
    title: qsTr("myApp")

    TableView {
        sortIndicatorVisible: true
        model: sqlData
        anchors.fill: parent

        TableViewColumn {
            role: "Nome"
            title: "Nome"
            width: 200
        }

        TableViewColumn {
            role: "Residenza"
            title: "Residenza"
            width: 200
        }

        TableViewColumn {
            role: "Assicurazione"
            title: "Assicurazione"
            width: 200
        }
    }
}
C++头文件

#ifndef LISTMODEL_H
#define LISTMODEL_H

#include <QtSql/QSqlTableModel>
#include <QHash>
#include <QByteArray>
#include <QVariant>
#include <QModelIndex>

class ListModel: public QSqlTableModel
{
    Q_OBJECT
    Q_PROPERTY ( QString sqlFilter READ getSQLFilter WRITE setSQLFilter )
private:
    QHash<int, QByteArray> roles;
    QString getSQLFilter() { return filter(); }
    void setSQLFilter(const QString &filter) { setFilter(filter); }

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

public:
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole ) const;
    void generateRoleNames();

#ifdef HAVE_QT5
    virtual QHash<int, QByteArray> roleNames() const{return roles;}
#endif
};

#endif // LISTMODEL_H
实施

#include "listmodel.h"
#include <QtSql/QSqlRecord>
#include <QDebug>
#include <iostream>
#include <QModelIndex>

ListModel::ListModel(QObject *parent) : QSqlTableModel(parent) {

}

QVariant ListModel::data ( const QModelIndex & index, int role ) const
{
    if(index.row() >= rowCount())
        return QVariant();

    if(role < Qt::UserRole)
        return QSqlTableModel::data(index, role);

    QModelIndex modelIndex = this->index(index.row(), role - Qt::UserRole - 1);
    return QSqlTableModel::data(modelIndex, Qt::DisplayRole);
}

void ListModel::generateRoleNames()
{
    roles.clear();

    for (int i = 0; i < columnCount(); i++)
    {
        roles[Qt::UserRole + i + 1] = QVariant(headerData(i, Qt::Horizontal)).toByteArray();
    }
}
main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QtSql/QSqlDatabase>
#include <QMessageBox>
#include <listmodel.h>
#include <QQmlContext>
#include <QTableView>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QString dbName(app.applicationDirPath());
    dbName.append("/mydb.sqlite");

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbName);
    if (!db.open()) {
        QMessageBox::critical(0, qApp->tr("Cannot open database"), "", QMessageBox::Cancel);
        return 0;
    }

    ListModel dataModel;
    dataModel.setTable("Clienti");
    dataModel.setEditStrategy(QSqlTableModel::OnFieldChange);
    dataModel.select();
    dataModel.generateRoleNames();

    while(dataModel.canFetchMore())
        dataModel.fetchMore();
/*
    QTableView *myView = new QTableView;
    myView->setModel( dataModel );
    myView->show();
*/
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("sqlData", &dataModel);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
    db.close();
}

我们从哪里获得材料模块?没有它就无法运行代码。没关系,让它工作。如果我拿走了太多的代码,请告诉我。材料样式是从纸莎草。关于我的问题,我只能说去你的。HAVE_QT5未设置,因此二进制文件中没有方法roleNames。我认为设置宏是QtCreator的责任。我们从哪里获得材料模块?没有它就无法运行代码。没关系,让它工作。如果我拿走了太多的代码,请告诉我。材料样式是从纸莎草。关于我的问题,我只能说去你的。HAVE_QT5未设置,因此二进制文件中没有方法roleNames。我认为设置宏是创建者的责任。