【发布时间】:2014-09-18 23:31:41
【问题描述】:
我想从 C++ 向 Qml 公开一个 QStringlist 列表,并从 QML 端访问它的元素及其方法。
这里我到目前为止做了什么:
这是我的 .h 文件,用于一个名为 manager 的类。
#include <QObject>
#include <QStringList>
#include <QList>
class Manager : public QObject
{
Q_OBJECT
Q_PROPERTY(QStringList imagesPaths READ imagesPaths)
Q_PROPERTY(QStringList imagesPaths READ imagesPaths2)
Q_PROPERTY(QList<QStringList> imagesPathsLists READ imagesPathsLists)
public:
explicit Manager(QObject *parent = 0);
QStringList imagesPaths() const;
QStringList imagesPaths2() const;
QList<QStringList> imagesPathsLists()const;
signals:
public slots:
private:
QStringList m_imagesPaths;
QStringList m_imagesPaths2;
QList<QStringList> m_imagesPathsLists;
};
这是我用于类方法实现的 .CPP 文件
#include "manager.h"
Manager::Manager(QObject *parent) :
QObject(parent)
{
m_imagesPaths << "one" << "two" << "three" << "four";
m_imagesPaths2 << "one-2" << "two-2" << "three-2" << "four-2";
m_imagesPathsLists << m_imagesPaths << m_imagesPaths2;
}
QStringList Manager::imagesPaths() const
{
return m_imagesPaths;
}
QStringList Manager::imagesPaths2() const
{
return m_imagesPaths2;
}
QList<QStringList> Manager::imagesPathsLists() const
{
return m_imagesPathsLists;
}
以及包含我的班级注册的 main.cpp 文件
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <qqmlcontext.h>
#include "manager.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
Manager *mng = new Manager();
QQmlContext *ctxt = viewer.rootContext();
ctxt->setContextProperty("Manager",mng);
viewer.setMainQmlFile(QStringLiteral("qml/listOfLists/main.qml"));
viewer.showExpanded();
return app.exec();
}
最后是尝试从列表中获取数据的 .Qml 文件
import QtQuick 2.0
Rectangle {
width: 360
height: 360
MouseArea {
anchors.fill: parent
onClicked: {
for(var i = 0; i < Manager.imagesPathsLists.count(); i++){
for(var j = 0; j < Manager.imagesPathsLists[i].count(); j++){
console.log(Manager.imagesPathsLists[i].at(j))
}
}
}
}
}
每当我点击矩形时,我都会收到以下错误
QMetaProperty::read: Unable to handle unregistered datatype 'QList<QStringList>' for property 'Manager::imagesPathsLists'
file:///E:/DevWork/build-listOfLists-Desktop_Qt_5_2_1_MinGW_32bit-Debug/qml/listOfLists/main.qml:10: TypeError: Cannot call method 'count' of undefined
我已经尝试解决这个问题两天了。我尝试了 QQmlListProperty,但没有成功,我不知道我搞砸了什么。
【问题讨论】:
-
@KubaOber 好吧,你提到的线程并没有解决我的问题,我已经成功地将 QstringList 暴露给 Qml,但这里的问题是我试图暴露一个 QList
相同我使用 QStringList 的方式,但它不起作用。我收到此错误 QMetaProperty::read: Unable to handle unregistered datatype 'QList<QStringList>' for property 'Manager::imagesPathsLists' -
对不起,我没有注意到这个细节。
-
您是否尝试向 QMetaData 注册您的数据类型?
-
@CapelliC 我正在使用 QStringList 我应该注册它吗?