我目前在Meego上使用QML和JS在大部分内容中创建应用程序。现在我偶然发现了一个问题。
从javascript我想调用一个C ++函数来读取文本文件,解析它,然后返回一个解析结果的数组。 所以我创建了一个名为parse()的Q_INVOKABLE函数,并通过javascript
调用它function parse() {
var myArray = new Array();
myArray = parser.parse("/home/user/MyDocs/angklungtext.txt")
if(myArray === undefined){
console.log("null found");
}
for(var i = 0; i < myArray.length; i++){
console.log(myArray[i][0] + "," + myArray[i][1])
}
}
这里是C ++中的解析函数
QVariantList* QMLParser::parse(QString filename)
{
qDebug() << "start debugging";
qDebug() << filename;
qDebug() << QDir::currentPath();
QDir dir;
qDebug()<< dir.absoluteFilePath(filename);
QFile file(filename);
if(!file.exists())
{
qDebug() << "File: " << file.fileName() << "tidak ditemukan";
return NULL;
}
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "Tidak dapat membuka file" << file.fileName() << "untuk ditulis";
return NULL;
}
QTextStream stream(&file);
QVariantList* myList = new QList<QVariant>;
while(!stream.atEnd())
{
QString line = stream.readLine();
qDebug() << line.trimmed();
QStringList lineList = line.split(":");
myList->append(lineList);
}
file.close();
return myList;
}
可悲。 当我尝试运行它时会给出这样的结果
start debugging
"/home/user/MyDocs/angklungtext.txt"
"/home/developer"
"/home/user/MyDocs/angklungtext.txt"
"1:1000"
"4:2000"
"5:3000"
"2:4000"
null found
file:///opt/memoryreader/qml/memoryreader/myjs.js:8: TypeError: Result of expression 'myArray' [undefined] is not an object.
看起来像C ++解析函数成功解析文件。它可以读取它,它可以将其保存到QVariantList中。 但是在将结果返回到javascript之后myArray仍然是[undefined]。 转换有什么问题吗?
答案 0 :(得分:2)
简单地简化C ++方面:
QVariant QMLParser::parse(QString filename)
{
QStringList myList;
qDebug() << "start debugging";
qDebug() << filename;
qDebug() << QDir::currentPath();
QDir dir;
qDebug() << dir.absoluteFilePath(filename);
QFile file(filename);
if(!file.exists()) {
qDebug() << "File: " << file.fileName() << "tidak ditemukan";
return NULL;
}
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Tidak dapat membuka file" << file.fileName() << "untuk ditulis";
return NULL;
}
QTextStream stream(&file);
while(!stream.atEnd()) {
QString line = stream.readLine();
qDebug() << line.trimmed();
myList << line.trimmed().split(":");
}
file.close();
return QVariant::fromValue(myList);
}
它应该有效!
请记住,QML必须看到QVariant
,即使其中包含QList
,Qt也能够使用{{1}将其大部分基本类型转换为QVariant
所以要广泛使用它。
哦,顺便说一下QVariant是引用而不是指针。
答案 1 :(得分:0)
我自己没有这样做,所以我只是大声思考。但我注意到你正在返回一个指向QVariantList的指针......这看起来很可疑。 (另外:如果你new
,那么谁会做delete
?)
您是否尝试按值返回?