簡體   English   中英

如何在TableView(QtQuick 2)上顯示QSqlTableModel的標頭?

[英]How to show headers from QSqlTableModel on TableView(QtQuick 2)?

我設置了要建模的標頭,但是無法在表格視圖中顯示它,為什么? 也許除了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();
}

main.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
                }
            }
        }
    }
}

表格模型

#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

結果

問題是如果Repeater模型是數字“ n”,則modelData是從“ 0”到“ n-1”的數字。 解決方案是能夠從QML訪問headerData,並且必須使用此Q_INVOKABLE:

class TableModel : public QSqlRelationalTableModel
{
    Q_OBJECT
public:
    using QSqlRelationalTableModel::QSqlRelationalTableModel;
    Q_INVOKABLE QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const;
};
// ...
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    return QSqlRelationalTableModel::headerData(section, orientation, role);
}
// ...

* .qml

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

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

暫無
暫無

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

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