我正在尝试通过信号将带有自定义元素的 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 来实现。你可以看看 QQmlListProperty或 QDeclarativeListProperty
与 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/