在QML(Qt)中读取和写入文件

在QML(Qt)中读取和写入文件,qt,qml,Qt,Qml,我正在尝试实现这一功能,并偶然发现了诺基亚的链接文章,但未能成功使用看似显而易见的代码示例。我想我不必说我是这个领域的新手 我应该将此代码段放在何处(这是页面上的第二个代码段)。 ): #包括“fileio.h” Q_DECL_导出int main(int argc,char*argv[]) { qmlRegisterType(“FileIO”,1,0,“FileIO”); } 当我把上面的代码片段放在我的主窗体中时,我还不断收到一个关于qmlRegisterType没有在上下文中注册的错误。

我正在尝试实现这一功能,并偶然发现了诺基亚的链接文章,但未能成功使用看似显而易见的代码示例。我想我不必说我是这个领域的新手

我应该将此代码段放在何处(这是页面上的第二个代码段)。 ):

#包括“fileio.h”
Q_DECL_导出int main(int argc,char*argv[])
{
qmlRegisterType(“FileIO”,1,0,“FileIO”);
}
当我把上面的代码片段放在我的主窗体中时,我还不断收到一个关于qmlRegisterType没有在上下文中注册的错误。
有没有人能就如何实现这一点(或以QML/Qt读取和写入文件的任何方法)提供一些建议?

诺基亚在本教程中编写的示例并非纯粹的QML程序。它既包含C++又包含QML。这种程序通常是一个C++程序,加载一个QML文件并渲染它。C++程序通常以一个名为。在您的例子中,正是这个“main()”函数加载QML主文件(
main.QML
)并呈现它

但是在加载QML主文件之前,您必须告诉QML系统您将使用名为
FileIO
的自定义QML类。为此,必须使用
intqmlregisterType(constchar*package、intmajorversion、intminorversion、char*classNameInQML) C++函数。它需要大约5个参数:

    强> t<强>:C++模板参数。这是你的C++类(Fielo)。
  • :所有QML类都在版本连接的包中。这是包的名称
  • majorVersion:所有QML类都在版本连接的包中。这是软件包的主要版本号
  • minorVersion:所有QML类都在版本连接的包中。这是软件包的次要版本号
  • classNameInQML:所有QML类都在版本连接的包中。这是您在QML文件中使用的类的名称,大多数时候,名称与C++类名相同。

使用此函数时,必须在C++文件中包含C++头,在这里写入:

  • 如果使用Qt 4,标题为
  • 如果使用Qt 5,标题为
最后,你应该有这样一些东西:

Me.CPP(文件与主()C++函数):


注意:为了避免混淆,我更改了诺基亚教程中的一些“FileIO”。

如果您的文件仅为文本,您可以使用XMLHttpRequest(用于读取和写入),如下所示:

function openFile(fileUrl) {
    var request = new XMLHttpRequest();
    request.open("GET", fileUrl, false);
    request.send(null);
    return request.responseText;
}

function saveFile(fileUrl, text) {
    var request = new XMLHttpRequest();
    request.open("PUT", fileUrl, false);
    request.send(text);
    return request.status;
}
var success = fileUtils.writeFile("TextFiles/myFile.txt", "test text")
以下是演示应用程序(Qt 5.6):


请注意,如果您尝试使用上述函数,所有现代浏览器都会抛出安全异常,但QML允许这样做(即使是文件重写)。但不确定这是设计还是错误。

在本页上可以找到完整的FileIO示例:

我们将省略属性,因为它们是简单的setter和getter

read方法以读取模式打开文件,并使用文本流读取数据

源代码可以在这里找到:

使用V-Play SDK,您可以使用QML中的类访问任何平台上的文件系统

这看起来像这样:

function openFile(fileUrl) {
    var request = new XMLHttpRequest();
    request.open("GET", fileUrl, false);
    request.send(null);
    return request.responseText;
}

function saveFile(fileUrl, text) {
    var request = new XMLHttpRequest();
    request.open("PUT", fileUrl, false);
    request.send(text);
    return request.status;
}
var success = fileUtils.writeFile("TextFiles/myFile.txt", "test text")

在C++中,这是绝对要做的。让QML保持它应有的薄UI层。弗兰克,谢谢你的回复。实际上,链接中的代码是C++中文件访问的一种实现方式,我的问题是如何完成这个(再次在C++中),你把你的“主窗体”叫做什么?AlxISMDM——我没有主ID,它驻留在MIN。QMLAR-DEX中。我想这本教程是为有经验的程序员准备的,它从来都不清楚qmlRegisterType参数,这让我完全被绊倒了!但正如我所怀疑的,结果就是这么简单。再次感谢你,我们正在失去希望!链接断开:(我想这是新链接:谢谢你报告断开的链接。我已经更新了它。
import QtQuick 2.6
import QtQuick.Dialogs 1.2
import QtQuick.Controls 1.5

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Demo App")

    function openFile(fileUrl) {
        var request = new XMLHttpRequest();
        request.open("GET", fileUrl, false);
        request.send(null);
        return request.responseText;
    }

    function saveFile(fileUrl, text) {
        var request = new XMLHttpRequest();
        request.open("PUT", fileUrl, false);
        request.send(text);
        return request.status;
    }

    FileDialog {
        id: openFileDialog
        nameFilters: ["Text files (*.txt)", "All files (*)"]
        onAccepted: textEdit.text = openFile(openFileDialog.fileUrl)
    }

    FileDialog {
        id: saveFileDialog
        selectExisting: false
        nameFilters: ["Text files (*.txt)", "All files (*)"]
        onAccepted: saveFile(saveFileDialog.fileUrl, textEdit.text)
    }

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("&Open")
                onTriggered: openFileDialog.open()
            }
            MenuItem {
                text: qsTr("&Save")
                onTriggered: saveFileDialog.open()
            }
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }

    TextArea {
        id: textEdit
        anchors.fill: parent
        text:
            "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
            "sed do eiusmod tempor incididunt ut labore et dolore magna " +
            "aliqua. Ut enim ad minim veniam, quis nostrud exercitation " +
            "ullamco laboris nisi ut aliquip ex ea commodo cosnsequat. ";
    }
}
class FileIO : public QObject {
    ...
    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
    ...
public:
    Q_INVOKABLE void read();
    Q_INVOKABLE void write();
    ...
}
void FileIO::read()
{
    if(m_source.isEmpty()) {
        return;
    }
    QFile file(m_source.toLocalFile());
    if(!file.exists()) {
        qWarning() << "Does not exits: " << m_source.toLocalFile();
        return;
    }
    if(file.open(QIODevice::ReadOnly)) {
        QTextStream stream(&file);
        m_text = stream.readAll();
        emit textChanged(m_text);
    }
}
void FileIO::write()
{
    if(m_source.isEmpty()) {
        return;
    }
    QFile file(m_source.toLocalFile());
    if(file.open(QIODevice::WriteOnly)) {
        QTextStream stream(&file);
        stream << m_text;
    }
}
var success = fileUtils.writeFile("TextFiles/myFile.txt", "test text")