【问题标题】:Cannot convert C++ type to QML无法将 C++ 类型转换为 QML
【发布时间】:2014-07-12 09:22:31
【问题描述】:

我正在尝试通过信号将带有自定义元素的 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 时,一切正常

【问题讨论】:

    标签: c++ qt qml qtcore qt-signals


    【解决方案1】:

    如果一个只读属性对你来说就足够了,并且 bashQuote 继承了 QObject,那么你需要使用下面的 QtQuick 2 来做到这一点。您可以使用 QtQuick1 查看QQmlListPropertyQDeclarativeListProperty

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

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

    【讨论】:

    • 谢谢你的回答,但是如何将 bashQuote 注册到 QMetaObject 系统?我在互联网上找到了 qRegisterMetaType 函数和 Q_DECLARE_METATYPE 宏,但它看起来不起作用:(
    • @Lobster: Does not work 不起作用。
    • 我改变了 void setData(QList arg);向 void reader::setData(QVariantList arg) 发出信号并将元素添加到该列表中: bashQuote b; b.quote = "二"; QVariantList 数据; dat.push_back(QVariant::fromValue(b));之后在 QML 中,我得到了 QVariant(bashQuote) 元素的数组,但我无法访问该对象的任何属性和函数
    • 你解决了吗,龙虾?否则,我想我会删除我的答案。 QQmlListProperty 目前似乎只支持只读属性。
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多