如何在qml中将模型传递到播放列表?

时间:2018-12-04 10:51:58

标签: c++ qt qml

我有一个保存歌曲URL的模型

#ifndef PLAYLISTITEM_H
#define PLAYLISTITEM_H
#include<QUrl>
#include <QObject>

class PlaylistItem : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QUrl source READ source CONSTANT)


public:
    explicit PlaylistItem(QUrl& source, QObject *parent = nullptr);
    QUrl source() const;

signals:

public slots:
private:
    QUrl m_source;
};

#endif // PLAYLISTITEM_H

我有一个 SongManager 类,该类将数据设置为此模型,并且我已经在main.cpp中设置了这样的属性

SongManager manager;
ctxt->setContextProperty("manager", &manager);

当我这样访问QML模型时

Audio {
    id: music_player;
    autoPlay: false;
    playlist: manager.getSongListByAlbumName("someAlbumName", true)
}

我收到此错误

Unable to assign QJSValue to ::QDeclarativePlaylist*

为什么会出现此错误,如果我想用自己的模型覆盖QML元素(如PlayListItem),该怎么办?

1 个答案:

答案 0 :(得分:1)

  

我有一个保存歌曲URL的模型

以下代码不是该术语的任何QML定义的模型。

Audio期望有一个Playlist元素,即使您有一个模型,它也不会说任何模型。仅仅因为Playlist可以用作模型并不一定意味着任何模型都可以用作播放列表。但是,即使有可能,也肯定会需要具有source角色的模型,而不是具有source属性的对象。

manager.getSongListByAlbumName()返回的内容目前还是个谜,因此只有一个通灵者才能回答这个问题。

假设manager.getSongListByAlbumName()返回可以从QML迭代的某种列表,则可以使用相应的方法使用该列表来填充Playlist。我认为可以将QList<QUrl>直接传递给Playlist.addItems(sources)并使其正常工作,因为这种特定的容器类型会自动转换为QML。