QML:写入文本文件的最简单方法?

Ano*_*non 8 qt application-development qml ubuntu-sdk ubuntu-touch

QML 目前缺乏基本的系统命令,所以我正在寻找最简单的模板来写入/tmp/text.txt.

Syl*_*eau 5

没有办法从 QML/Javascript 写入文件,所以我们需要一点 C++ 来完成这项工作。

Qt Quick 2 Application (Built-in Elements)在 Qt Creator 中创建一个名为FileIO的新项目,其中包含以下文件:

项目文件:FileIO.pro

# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp

# Please do not modify the following two lines. Required for deployment.
include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
qtcAddDeployment()

HEADERS += fileio.h
Run Code Online (Sandbox Code Playgroud)

头文件:fileio.h(灵感来自于 QML 中的读写文件

#ifndef FILEIO_H
#define FILEIO_H

#include <QObject>
#include <QFile>
#include <QTextStream>

class FileIO : public QObject
{
    Q_OBJECT

public slots:
    bool write(const QString& source, const QString& data)
    {
        if (source.isEmpty())
            return false;

        QFile file(source);
        if (!file.open(QFile::WriteOnly | QFile::Truncate))
            return false;

        QTextStream out(&file);
        out << data;
        file.close();
        return true;
    }

public:
    FileIO() {}
};

#endif // FILEIO_H
Run Code Online (Sandbox Code Playgroud)

主.cpp :

#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
#include "fileio.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    FileIO fileIO;

    QtQuick2ApplicationViewer viewer;
    viewer.rootContext()->setContextProperty("fileio", &fileIO);
    viewer.setMainQmlFile(QStringLiteral("qml/FileIO/main.qml"));
    viewer.showExpanded();

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

最后是qml/FileIO/main.qml

import QtQuick 2.0

Rectangle {
    width: 360
    height: 360
    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            fileio.write("/tmp/test", "Ask Ubuntu");
            Qt.quit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要构建应用程序,请打开终端并转到 FileIO 项目文件夹以键入:

`qmake && make && ./FileIO`.
Run Code Online (Sandbox Code Playgroud)

它将启动应用程序。如果单击 MainView,将创建文本文件并关闭应用程序。

更新

上面的代码对桌面应用程序没有限制。关于 Ubuntu Touch 的写入权限,您必须遵循有关单击包的限制的准则:

应用程序将在标准 XDG 基本目录中具有读/写访问文件。具体来说:

XDG_CACHE_HOME/<APP_PKGNAME>
XDG_CONFIG_HOME/<APP_PKGNAME>
XDG_DATA_HOME/<APP_PKGNAME>
XDG_RUNTIME_DIR/confined/<APP_PKGNAME>
Run Code Online (Sandbox Code Playgroud)

其中 APP_PKGNAME 是点击清单的“名称”字段中使用的内容。例如,如果点击清单有这个:

$ cat ./manifest.json
{
  "name": "com.ubuntu.developer.you.yourapp",
  ...
}
Run Code Online (Sandbox Code Playgroud)

那么应用程序将拥有对这些目录及其下的任何文件或子目录的读/写访问权限:

XDG_CACHE_HOME/com.ubuntu.developer.you.yourapp
XDG_CONFIG_HOME/com.ubuntu.developer.you.yourapp
XDG_DATA_HOME/com.ubuntu.developer.you.yourapp
XDG_RUNTIME_DIR/confined/com.ubuntu.developer.you.yourapp
Run Code Online (Sandbox Code Playgroud)


Ano*_*non 4

新文件或项目。选择带有 C++ 插件的 QML 应用程序。qmake 通常比 cmake 更容易掌握。 新文件或项目

为您的项目选择一个名称。下一个。 为您的项目选择一个名称

通常您可以只选择所选的默认框架。下一个。 通常您可以只选择所选的默认框架。

添加 Bazaar 版本控制,因为它与 Launchpad 配合良好。如果您熟悉 Git,也可以尝试一下。Launchpad 支持两者,但截至 2016 年 7 月,Git 支持仍然相当新。 添加 Bazaar 版本控制,因为它与 Launchpad 配合良好。

编辑标题,添加注释中的三行。 编辑标题,添加注释中的三行。

编辑您的源代码,仅添加底部的函数。 编辑您的源代码,仅添加底部的函数。

编辑 Main.qml 文件,仅添加底部的组件。 编辑 Main.qml 文件,仅添加底部的组件。

运行您的应用程序,并在构建目录中找到文本文件。构建目录与项目目录位于同一目录中,并且开头带有单词“build-”。 运行您的应用程序,并在构建目录中找到文本文件。