Antworten:
Es gibt keine Möglichkeit, aus QML / Javascript in eine Datei zu schreiben, daher benötigen wir ein bisschen C ++, um den Job zu erledigen.
Erstellen Sie Qt Quick 2 Application (Built-in Elements)
in Qt Creator ein neues Projekt mit dem Namen FileIO mit den folgenden Dateien:
Die Projektdatei: 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
Die Header-Datei: fileio.h (inspiriert vom Lesen und Schreiben von Dateien in 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
main.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();
}
Und schließlich 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();
}
}
}
Öffnen Sie zum Erstellen der Anwendung ein Terminal und geben Sie Folgendes in den FileIO-Projektordner ein:
`qmake && make && ./FileIO`.
Die Anwendung wird gestartet. Wenn Sie auf die Hauptansicht klicken, wird die Textdatei erstellt und die Anwendung geschlossen.
Update :
Der obige Code funktioniert ohne Einschränkungen für eine Desktop-Anwendung. In Bezug auf Schreibberechtigungen für Ubuntu Touch müssen Sie die Richtlinien zur Beschränkung für Klickpakete befolgen :
Die Anwendung verfügt über Lese- / Schreibzugriffsdateien in den Standard-XDG-Basisverzeichnissen. Speziell:
XDG_CACHE_HOME/<APP_PKGNAME> XDG_CONFIG_HOME/<APP_PKGNAME> XDG_DATA_HOME/<APP_PKGNAME> XDG_RUNTIME_DIR/confined/<APP_PKGNAME>
Dabei wird APP_PKGNAME im Feld "Name" des Klickmanifests verwendet. Beispiel: Wenn das Klickmanifest Folgendes enthält:
$ cat ./manifest.json { "name": "com.ubuntu.developer.you.yourapp", ... }
Dann hat die App Lese- / Schreibzugriff auf diese Verzeichnisse und alle Dateien oder Unterverzeichnisse darunter:
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
Neue Datei oder neues Projekt. Wählen Sie die QML App mit C ++ Plugin. qmake ist im Allgemeinen leichter aufzunehmen als cmake.
Wählen Sie einen Namen für Ihr Projekt. Nächster.
Normalerweise können Sie einfach das ausgewählte Standard-Framework auswählen. Nächster.
Fügen Sie Bazaar Version Control hinzu, da es gut mit Launchpad funktioniert. Sie können auch Git ausprobieren, wenn Sie damit vertraut sind. Launchpad unterstützt beide, aber die Git-Unterstützung ist ab Juli 2016 noch ziemlich neu.
Bearbeiten Sie Ihre Kopfzeile und fügen Sie die drei Zeilen aus den Kommentaren hinzu.
Bearbeiten Sie Ihre Quelle und fügen Sie nur die Funktion unten hinzu.
Bearbeiten Sie Ihre Main.qml-Datei und fügen Sie nur die Komponente unten hinzu.
Führen Sie Ihre Anwendung aus und suchen Sie die Textdatei in Ihrem Build-Verzeichnis. Das Erstellungsverzeichnis befindet sich im selben Verzeichnis wie Ihr Projektverzeichnis und dem Wort "build-" wird am Anfang vorangestellt.
import Foobar 1.0
? + Müssen Sie es nicht zuerst registrieren, um main.cpp
die qmlRegisterType<>()
Methode zu verwenden?
Um die Confinement-Richtlinie zu verdeutlichen, ersetzen Sie Folgendes, wenn Sie eine Datei unter Ubuntu Touch in Ihrer Datei mytype.cpp schreiben möchten:
QString filename = "text.txt";
durch:
QString filename = "/home/phablet/.local/share/your_app_name/text.txt";