Как динамически добавлять данные в модель в qml? - PullRequest
0 голосов
/ 03 декабря 2018

Я создаю приложение музыкального плеера, в которое мне нужно загрузить данные песни на основе названия альбома.Я инициализировал свою модель, передав объект модели в qml, как это в файле main.cpp

      albumSongs globalSongListModel;
      ctxt->setContextProperty("globalSongListModel", &globalSongListModel);

в альбоме этого класса. У меня есть следующие свойства

Q_PROPERTY(QString songName READ songName CONSTANT)
Q_PROPERTY(QString songFileUrl READ songFileUrl CONSTANT)
Q_PROPERTY(QString songDuration READ songDuration CONSTANT)

У меня есть открытыйслот в классе albumSongs, который получает данные из события qml

public slots:
    QList<QObject*> getSongListByAlbumName(QString albumName){
        dbHelper dbh;
        QList<QObject*> songList;
        dbh.loadDataByAlbumName(albumName, songList);
        return songList;

    }

функция loadDataByAlbumName () объявлена ​​в классе dbhelper следующим образом

void dbHelper::loadDataByAlbumName(QString albumName, QList<QObject*>& songList) {
    QString query = "SELECT " + this->LI_DATA_TABLE_COLUMN_ONE + "," + this->LI_DATA_TABLE_COLUMN_TWO + "," + this->LI_DATA_TABLE_COLUMN_NINE +  " FROM " + this->LI_DATA_TABLE_NAME + " WHERE " + this->LI_DATA_TABLE_COLUMN_THREE + "=?";
    QSqlQuery sql;
    sql.prepare(query);
    sql.bindValue(0, albumName);
    sql.exec();
    while (sql.next()) {
        QString songName = sql.value(0).toString();
        QString songUrl = sql.value(1).toString();
        QString songDuration = sql.value(2).toString();
        songList.append(new albumSongs(songName, songUrl, songDuration));
    }
}

я могу успешно загрузить данные изdb to QListsongList Но когда я пытаюсь использовать его в файле qml следующим образом:

ListView {
    id: song_list_view
    width: 180; height: 200
    anchors.top: name.bottom;
    anchors.topMargin: 30
    delegate: Text {
        text: songName + " " + songFileUrl
    }




}

я получаю сообщение об ошибке в столбце делегата, в котором говорится, что songName не определено.

Я установилэта модель при вводе события мыши, как это

  onEntered: {
            song_list_view.model = globalSongListModel.getSongListByAlbumName(globalName)

        }

Это правильный способ выполнения этой задачи?Что я должен сделать, чтобы устранить ошибку?

1 Ответ

0 голосов
/ 03 декабря 2018

Прежде всего, у вас плохой дизайн: как у albumSongs есть songName, songFileUrl и songDuration ?, на самом деле у вас должен быть класс, в котором хранятся данные песни, и другой менеджер классов, имеющий слот, который возвращает список.

Переходя к проблеме, когда модель представляет собой список, вы должны использовать modelData для доступа к каждому элементу, но вы все равно не можете получить доступ к свойствам, потому что QML не знает этот класс, поэтому вы должны зарегистрировать егос qmlRegisterUncreatableType(), чтобы вы могли получить доступ к свойствам, но не создавать объекты этого класса в QML:

class Song : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString songName READ songName CONSTANT)
    Q_PROPERTY(QString songFileUrl READ songFileUrl CONSTANT)
    Q_PROPERTY(QString songDuration READ songDuration CONSTANT)
public:
    explicit Song(const QString & songName="",
                  const QString & songFileUrl="",
                  const QString & songDuration="",
                  QObject *parent = nullptr):
        QObject(parent),
        m_songName(songName),
        m_songFileUrl(songFileUrl),
        m_songDuration(songDuration)
    {}
    QString songName() const{
        return m_songName;
    }

    QString songFileUrl() const{
        return  m_songFileUrl;
    }
    QString songDuration() const{
        return m_songDuration;
    }

private:
    QString m_songName;
    QString m_songFileUrl;
    QString m_songDuration;
};

class SongManager: public QObject{
    Q_OBJECT
public:
    explicit SongManager(QObject *parent=nullptr):
        QObject(parent)
    {}
public slots:
    static QList<QObject*> getSongListByAlbumName(const QString & name){
        QList<QObject*> songList;
        dbHelper dbh;
        dbh.loadDataByAlbumName(albumName, songList);
        return songList;
    }
};

main.cpp

// ...
qmlRegisterUncreatableType<Song>("Songs", 1, 0, "Song", "Error class uncreatable");
// ...
SongManager manager;
ctxt->setContextProperty("manager", &manager);
// ...

*. qml

// ...
import Songs 1.0
// ...
ListView {
    id: song_list_view
    width: 180; height: 200
    anchors.top: name.bottom;
    anchors.topMargin: 30
    delegate: Text {
        text: modelData.songName + " " + modelData.songFileUrl
    }
}
// ...
onEntered: song_list_view.model = manager.getSongListByAlbumName(globalName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...