C++ 如何在TableView(QtQuick 2)上显示QSqlTableModel中的标题?

C++ 如何在TableView(QtQuick 2)上显示QSqlTableModel中的标题?,c++,qt,qml,C++,Qt,Qml,我将标题设置为model,但我无法在tableview中显示,为什么?除了modelData之外,可能还有其他一些参数,我可以使用它们将头的名称返回到tableview qml 我无法提供更多的示例,因为您没有我的sql数据库。此代码仅将数据返回到tableview。可能tableview(qt quick 2)无法返回标题 在类TableModel中,我不重写QSqlTableModel中的标准方法 main.cpp #include <QGuiApplication> #incl

我将标题设置为model,但我无法在tableview中显示,为什么?除了modelData之外,可能还有其他一些参数,我可以使用它们将头的名称返回到tableview qml

我无法提供更多的示例,因为您没有我的sql数据库。此代码仅将数据返回到tableview。可能tableview(qt quick 2)无法返回标题

在类TableModel中,我不重写QSqlTableModel中的标准方法

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlTableModel>
#include <QFontDatabase>

#include <QDebug>
#include "TableModel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("172.17.110.69");
    db.setDatabaseName("usb_DB");
    db.setUserName("usb_secure");
    db.setPassword("QWer!234");
    db.setPort(3306);
    db.open();
    qDebug()<<db.isOpen();
    TableModel* model = new TableModel(&app,db);
    model->setTable("usb_devices");
    model->sort(0,Qt::SortOrder::AscendingOrder);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0,Qt::Orientation::Horizontal,"Column0");
    model->setHeaderData(1,Qt::Orientation::Horizontal,"Column1");
    model->setHeaderData(2,Qt::Orientation::Horizontal,"Column2");
    model->setHeaderData(3,Qt::Orientation::Horizontal,"Column3");


    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));

    QQmlContext *context = engine.rootContext();
    context->setContextProperty("tableModel", model);


    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}
TableModel.h

#ifndef TABLEMODEL_H
#define TABLEMODEL_H

#include <QtSql/QSqlRelationalTableModel>
#include <QSqlRecord>

class TableModel : public QSqlRelationalTableModel
{
    Q_OBJECT
    using QSqlRelationalTableModel::QSqlRelationalTableModel;

public slots:
    Q_INVOKABLE bool set(int, int, QString);

private:
    QSqlRecord rec;
};

#endif // TABLEMODEL_H
\ifndef表格模型
#定义表格模型
#包括
#包括
类TableModel:公共QSqlRelationalTableModel
{
Q_对象
使用QSqlRelationalTableModel::QSqlRelationalTableModel;
公众时段:
Q_可调用布尔集(int,int,QString);
私人:
QSqlRecord;
};
#endif//TABLEMODEL\u H
结果


问题在于,如果中继器型号是数字“n”,则型号数据是从“0”到“n-1”的数字。解决方案是能够从QML访问headerData,对于此问题,必须使用INVOKABLE:

class TableModel:公共QSqlRelationalTableModel
{
Q_对象
公众:
使用QSqlRelationalTableModel::QSqlRelationalTableModel;
Q_可调用的QVariant headerData(int节,Qt::Orientation,int role=Qt::DisplayRole)常量;
};
*.qml

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.Material 2.12
import QtQuick.Window 2.11

ApplicationWindow {
    id:appWindow
    visible: true

    TableView {
        id: tableView
        boundsBehavior:Flickable.StopAtBounds
        reuseItems: true
        clip: true

        columnWidthProvider: function (column) { return 300; }
        rowHeightProvider: function () { return 48; }
        anchors.fill: parent
        topMargin: columnsHeader.implicitHeight

        model: tableModel

        delegate:ItemDelegate{
            id: delegateItem

            TextField{
                text: modelData
                horizontalAlignment: Text.AlignHCenter
            }

        }

        Row {
            id: columnsHeader
            y: tableView.contentY
            z:2

            Repeater {
                model: tableView.columns > 0 ? tableView.columns : 1

                Label {
                    id: labelRow
                    width: tableView.columnWidthProvider(index)
                    height: tableView.rowHeightProvider()
                    text: modelData
                }
            }
        }
    }
}
// ...
Repeater {
    model: tableView.columns > 0 ? tableView.columns : 1

    Label {
        id: labelRow
        width: tableView.columnWidthProvider(index)
        height: tableView.rowHeightProvider()
        text: tableModel.headerData(modelData, Qt.Horizontal) // <---
    }
}
// ...
/。。。
中继器{
型号:tableView.columns>0?tableView.columns:1
标签{
id:labelRow
宽度:tableView.columnWidthProvider(索引)
高度:tableView.rowHeightProvider()

text:tableModel.headerData(modelData,Qt.Horizontal)/@eyllansc我做到了什么是
tableModel
?@eyllansc我需要我的类模型,用于我的特定任务,但我不重写标准的QSqlTableModel方法。该类包含一些我的方法(用于qml);那么,如果我使用QTableModel,那么我可以观察您显示的内容?@eyllanesc是的,您可以。我提供tableview.h
// ...
Repeater {
    model: tableView.columns > 0 ? tableView.columns : 1

    Label {
        id: labelRow
        width: tableView.columnWidthProvider(index)
        height: tableView.rowHeightProvider()
        text: tableModel.headerData(modelData, Qt.Horizontal) // <---
    }
}
// ...