QML: Einfachste Möglichkeit, in eine Textdatei zu schreiben?

Antworten:

5

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
Sylvain Pineau
quelle
1
Sind Sie sicher, dass Sie New Qt Quick 2 Application ausgewählt haben, sollte die Datei main.cpp vorhanden sein (getestet am 13.10 und 14.04). Es ist Anwendungen-> Qt Quick 2-Anwendung (integrierte Elemente) für 13.10 und Anwendungen-> Qt Quick-Anwendung-> Qt Quick 2 für 14.04
Sylvain Pineau
1
Warten Sie eine Minute, es ist gut da in Ihrem Screenshot, der zweite Punkt, Qt Quick Application
Sylvain Pineau
1
Nachdem Sie "Qt Quick Application" ausgewählt haben, müssen Sie den Projektnamen und den Pfad eingeben. Nach diesem Schritt können Sie "Qt Quick2" in der Dropdown-Liste auswählen (14.04 Verhalten)
Sylvain Pineau
1
Sie haben Recht für die Datei fileio.h, Sie müssen diese manuell erstellen.
Sylvain Pineau
1
Ich verstehe, danke, dass Sie die Liste der möglichen Lösungen verbessert haben!
Sylvain Pineau
4

Neue Datei oder neues Projekt. Wählen Sie die QML App mit C ++ Plugin. qmake ist im Allgemeinen leichter aufzunehmen als cmake. Neue Datei oder neues Projekt

Wählen Sie einen Namen für Ihr Projekt. Nächster. Wählen Sie einen Namen für Ihr Projekt

Normalerweise können Sie einfach das ausgewählte Standard-Framework auswählen. Nächster. Normalerweise können Sie einfach das ausgewählte Standard-Framework auswählen.

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. Fügen Sie Bazaar Version Control hinzu, da es gut mit Launchpad funktioniert.

Bearbeiten Sie Ihre Kopfzeile und fügen Sie die drei Zeilen aus den Kommentaren hinzu. 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 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. 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. Führen Sie Ihre Anwendung aus und suchen Sie die Textdatei in Ihrem Build-Verzeichnis.

Akiva
quelle
1
Können Sie mir bitte den 4. Schritt erklären? Sie benennen die qml-Datei mit dem gleichen Namen wie das Projekt und importieren dann den gleichen Namen in die qml-Datei? Mind = gefickt
Akash Agarwal
1
Ich habe es größtenteils nicht verstanden, 'foobar' in foobar.qml zu importieren
Akash Agarwal
1
Es scheint, dass Sie seit meinem letzten Kommentar nichts geändert haben, also nein, sorry.
Akash Agarwal
1
Vielen Dank, dass Sie so weit gegangen sind, um mir die Dinge zu erklären. Leider wird die Frage, die ich gestellt habe, immer noch nicht beantwortet. Was nützt es import Foobar 1.0? + Müssen Sie es nicht zuerst registrieren, um main.cppdie qmlRegisterType<>()Methode zu verwenden?
Akash Agarwal
1
Vielen Dank! Vielleicht möchten Sie dies nach Ihrem eigenen Wissen überprüfen. Lesen Sie die 2. Antwort: stackoverflow.com/questions/38423590/…
Akash Agarwal
0

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";
Antonio Sánchez
quelle