c++ - 无法将 C++ 类型转换为 QML

标签 c++ qt qml qtcore qt-signals

我正在尝试通过信号将带有自定义元素的 QList 传递给 QML。但是在 qml 中我得到了 QVariant(QList) 元素而不是常见的 javascript 数组。这是我的代码:

class reader : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<bashQuote*> data READ getData WRITE setData NOTIFY dataChanged)

public:
    explicit reader(QObject *parent = 0);
    Q_INVOKABLE void download(const QString& str);
    QList<bashQuote*> getData() const { return data;}

signals:
    void dataChanged(QList<bashQuote*> argum);

public slots:
    void setData(QList<bashQuote*> arg);
public:

    QList<bashQuote*> data;
};


class bashQuote : public QObject
{
    Q_OBJECT
public:
    explicit bashQuote(QObject *parent = 0);
    QString quote;
signals:

public slots:

};

Q_DECLARE_METATYPE(bashQuote*)

int main(int argc, char *argv[])
{

    qmlRegisterType<reader>("com.lobster.reader", 1, 0, "Reader");
    qRegisterMetaType<bashQuote*>("BashQuotePtr");

    return SailfishApp::main(argc, argv);
}

qml文件:

Page {
    id: page

    Reader {
        id: bestReader
        onDataChanged: {
            console.log("!!!!!!!!!!!!!onDataChanged")
        }
    }

    // To enable PullDownMenu, place our content in a SilicaFlickable
    SilicaFlickable {
        anchors.fill: parent

        Column {
            id: column

            Connections {
                 target: bestReader
                 onDataChanged: {
                     console.log(argum)
                     console.log(argum[0])
                 }
             }
        }
    }
}

控制台输出为:

[D] onDataChanged:41 - !!!!!!!!!!!!!onDataChanged
[D] onDataChanged:70 - QVariant(QList<bashQuote*>)
[D] onDataChanged:71 - undefined

但是,当我将 BashQuote 更改为 int 时,一切正常

最佳答案

如果只读属性对您来说已经足够并且 bashQuote 继承了 QObject,那么您需要使用下面的 QtQuick 2 来实现。你可以看看 QQmlListPropertyQDeclarativeListProperty 与 QtQuick1:

Q_PROPERTY(QQmlListProperty<bashQuote*> data READ getData
           WRITE setData NOTIFY dataChanged);

否则,我会尝试将您的 bashQuote 类型注册到 QMetaObject 系统和 QVariantList。

关于c++ - 无法将 C++ 类型转换为 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24711524/

相关文章:

c++ - "{" token 错误之前的预期类名

Qt QML ListView可见

c++ - 如何使用递归 QMutex

c++ - 如何将数组索引存储在映射中

c++ - 使用存储在同一目录的其他本地文件中的函数

c++ - 在 opencv for c 中,什么函数做与 Mat::convertTo 和 cvtColor() 完全相同的事情

windows - Qt 多头控制台应用程序在退出时挂起(使用 ctrl-c)

android - 将 Qt (for KDE) 开发的游戏移植到 Android

qt - 如何在SwipeView中防止页面手动滑动

java - 未调用静态对象的 Android ctor