我正在尝试实现Reading and writing files in QML并且遇到了诺基亚的链接文章,但未能成功使用看似明显的代码示例 . 我想我不必说我是这个领域的新手 .
我在哪里放置此代码段(这是页面上的第二个代码段 . ):
#include "fileio.h"
Q_DECL_EXPORT int main(int argc, char *argv[])
{
qmlRegisterType<FileIO, 1>("FileIO", 1, 0, "FileIO");
}
当我将上面的代码片段放在我的主窗体中时,我也继续收到关于qmlRegisterType未在上下文中注册的错误 . 有人可以就如何实现这个(或任何在QML / Qt中读写文件的方法)提供一些建议吗?
4 回答
诺基亚在本教程中编写的示例不是纯粹的QML程序 . 它包含C和QML . 这种程序通常是一个C程序,它加载一个QML文件并呈现它 . C程序通常以一个名为
int main(int argc, char *argv[]);
的函数开头 . 在您的情况下,这是"main()"函数,它加载您的QML主文件(main.qml
)文件并呈现它 .但在加载QML主文件之前,您必须告诉QML系统您将使用名为
FileIO
的自定义QML类 . 为此,您必须使用int qmlRegisterType<T>(const char * package, int majorVersion, int minorVersion, char * classNameInQML);
C函数 . 它需要大约5个参数:T :C模板参数 . 这是你的C类(FileIO) .
package :所有QML类都包含在版本中 . 这是包的名称 .
majorVersion :所有QML类都在包中,版本化 . 这是包的主要版本号 .
minorVersion :所有QML类都在包中,版本化 . 这是包的次要版本号 .
classNameInQML :所有QML类都在包中,版本化 . 这是您将在QML文件中使用的类的名称大多数情况下,名称与C类名称相同 .
要使用此功能,您必须在C文件中包含一个C头,您可以在其中编写它:
如果使用Qt 4, Headers 为
<QtDeclarative>
.如果使用Qt 5, Headers 为
<QtQml>
.最后你应该有这样的东西:
main.cpp(带有main()C函数的文件):
要加载的main.qml文件(从诺基亚教程开始):
注意:我已经从诺基亚教程中更改了一些“FileIO”以避免混淆 .
如果您的文件只是文本,您可以使用XMLHttpRequest(用于读取和写入),如下所示:
这是演示应用程序(Qt 5.6):
附:请注意,如果您尝试使用上述功能,所有现代浏览器都将抛出安全性异常,但QML允许它(即使是文件重写) . 但不确定是设计还是错误 .
使用V-Play SDK,您可以使用QML中的FileUtils类来访问任何平台上的文件系统 .
这看起来像这样:
可以在此页面上找到FileIO的完整示例:https://qmlbook.github.io/ch17-extensions/extensions.html#fileio-implementation
源代码可以在这里找到:https://github.com/qmlbook/qmlbook/tree/master/docs/ch17-extensions/src/fileio