Qt 5.7 - C ++ Signal / QML Slot - 自定义Meta类型包装在QVariant中

时间:2017-01-11 22:53:28

标签: qt qml signals slot metatype

我正在尝试将C ++信号连接到QML插槽。交换的数据是对我自己的类的对象的常量引用。因此,在加载QML文件之前,此类已注册到Qt元系统。

在代码中它看起来像这样:

自定义元类型的标题:

class QSong : public QObject
{

    private:

        Q_OBJECT

        Q_PROPERTY( QString artist READ artist CONSTANT )
        Q_PROPERTY( QString album READ album CONSTANT )
        Q_PROPERTY( QString title READ title CONSTANT)

        QString m_artist;   ///<  Data field containing the song's artist
        QString m_album;    ///<  Data field containing the song's album
        QString m_title;    ///<  Data field containing the song's title


    public:

        /* Constructors, copy assignment operator and getters */

};

Q_DECLARE_METATYPE(QSong)

元类型注册(在加载qml文件之前):

qmlRegisterType<QSong>("webradio.types", 1, 0, "Song");

C ++信号

void currentSongChanged( const QSong& song );

QML广告

Connections {
    target: Global.MPD;      // This is a tested to be working singleton
    onCurrentSongChanged: {
        print(song);
        print(song.artist);
    }
}

据我了解程序,这应该足以传输数据。仍然只要用有效的QSong对象触发信号,输出如下:

qml: QVariant(QSong)
qml: undefined

我之前已经问过类似的问题,但是那里提出的解决方案对我没有用。

例如,如果我尝试按照this thread中的建议将slot参数分配给本地属性,则输出状态

Cannot assign QSong to QSong*

我在版本6.2.1中使用Qt 5.7.1和GCC。

0 个答案:

没有答案