Вывод данных из таблицы mysql с помощью QSqlQueryModel

Я использую следующий пример: https://wiki.qt.io/How_to_Use_a_QSqlQueryModel_in_QML. Он использует QSqlQueryModel и имеет список выбора имен столбцов. Но в моем случае я не знаю имен столбцов таблицы в выводе, так как использую * запрос "Select * from users". Как распечатать данные в TableView в Qml.

Мой код ниже:

QtTest2.cpp

QtTest2::QtTest2(QObject *parent) :
    QSqlQueryModel(parent)
{
}

void QtTest2::setQuery(const QString &query, const QSqlDatabase &db)
{
    QSqlQueryModel::setQuery(query, db);
    generateRoleNames();
}

void QtTest2::setQuery(const QSqlQuery & query)
{
    QSqlQueryModel::setQuery(query);
    generateRoleNames();
}

void QtTest2::generateRoleNames()
{
    m_roleNames.clear();
    for( int i = 0; i < record().count(); i ++) {
        m_roleNames.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
    }
}

QVariant QtTest2::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;
}

void QtTest2::callSql()
{
    this->setQuery("SELECT * FROM users");
}

Qml-файл

import QtQuick 2.12
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3

Page {

id : somepageid

Component.onCompleted: {
    QtTest2.callsql();
}

TableView {
    id: tableView
    model: QtTest2

    // This is for header

    Row {
        id: columnsHeader
        y: tableView.contentY
        z: 2
        Repeater {
            model: tableView.columns > 0 ? tableView.columns : 1
            Label {
                width: tableView.columnWidthProvider(modelData)
                height: 35
                text: QtTest2.headerData(modelData, Qt.Horizontal)
                color: '#aaaaaa'
                font.pixelSize: 15
                padding: 10
                verticalAlignment: Text.AlignVCenter

                background: Rectangle { color: "#333333" }
            }
        }
    }


    // Here I cannot print the values dynamically. 
    // Currently this is printing the email (e.g.), in all columns in a row
    // But yes, each row prints different email
    // I want the rest of the column data dynamically printed
      
    delegate:Rectangle {
                        Text {
                            text: email
                            anchors.fill: parent
                            anchors.margins: 10
                            color: 'black'
                            font.pixelSize: 15
                            verticalAlignment: Text.AlignVCenter
                        }
                    }
    }

   

Изменить Я уже вызвал engine.rootContext()->setContextProperty("QtTest2", &qttest2); в main.cpp


person Chilarai    schedule 11.07.2020    source источник
comment
показывает импорт qml   -  person eyllanesc    schedule 11.07.2020
comment
@eyllanesc я отредактировал код qml   -  person Chilarai    schedule 11.07.2020
comment
Добавил мой полный код qml в блок кода   -  person Chilarai    schedule 11.07.2020


Ответы (1)


Поскольку вы используете QSqlQueryModel, основанный на QAbstractTableModel, вы можете получить доступ к каждому элементу, используя данные модели роли или отображение.

Text {
    text: model.modelData // or model.display
    anchors.fill: parent
    anchors.margins: 10
    color: 'black'
    font.pixelSize: 15
    verticalAlignment: Text.AlignVCenter
}
person eyllanesc    schedule 11.07.2020
comment
При этом я получаю ReferenceError: display is not defined и ReferenceError: modelData is not defined. Можете ли вы указать, что должно быть не так - person Chilarai; 11.07.2020
comment
@Chilarai есть ненужный } перед // Здесь ..., удалите его - person eyllanesc; 11.07.2020
comment
@Chilarai Я только что исправил эту опечатку в коде вашего вопроса, вы делаете то же самое со своим кодом - person eyllanesc; 11.07.2020
comment
Спасибо за решение. model.modelData/model.display решил мою проблему. - person Chilarai; 11.07.2020