QML: Maneira mais simples de gravar em um arquivo de texto?

7

O QML no momento não possui comandos básicos do sistema, então estou procurando o modelo mais simples para gravar em /tmp/text.txt .

    
por Akiva 12.04.2014 / 03:32

3 respostas

4

Novo arquivo ou projeto. Escolha o aplicativo QML com o plug-in C ++. qmake é geralmente mais fácil de pegar do que cmake.

Escolha um nome para o seu projeto. Próximo.

Normalmente, você pode simplesmente escolher a estrutura padrão selecionada. Próximo.

Adicione o controle de versão do Bazaar, pois ele funciona bem com o Launchpad. Você também pode experimentar o Git se estiver familiarizado com ele. O Launchpad suporta ambos, mas o suporte ao Git ainda é bastante novo em julho de 2016.

Edite seu cabeçalho, adicionando as três linhas dos comentários.

Edite sua fonte, adicionando apenas a função na parte inferior.

Edite seu arquivo Main.qml, adicionando apenas o componente na parte inferior.

Execute o aplicativo e localize o arquivo de texto no diretório de criação. O diretório de compilação está no mesmo diretório do seu diretório de projeto e tem a palavra "build-" prefixada no começo.

    
por Akiva 19.04.2014 / 16:59
5

Não há como escrever em um arquivo a partir do QML / Javascript, então precisamos de um pouco de C ++ para fazer o trabalho.

Crie um novo projeto Qt Quick 2 Application (Built-in Elements) no Qt Creator chamado FileIO com os seguintes arquivos:

O arquivo do projeto: 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

O arquivo de cabeçalho: fileio.h (inspirado por Lendo e escrevendo arquivos no 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();
}

E finalmente 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();
        }
    }
}

Para criar o aplicativo, abra um Terminal e vá para a pasta do projeto FileIO para digitar:

'qmake && make && ./FileIO'.

Ele iniciará o aplicativo. Se você clicar no MainView, o arquivo de texto será criado e o aplicativo será fechado.

Atualizar :

O código acima funcionará sem restrições para um aplicativo de desktop. Quanto às permissões de gravação para o Ubuntu Touch, você terá que seguir as orientações sobre confinamento para pacotes de cliques:

  

O aplicativo terá arquivos de acesso de leitura / gravação no XDG padrão   diretórios base. Especificamente:

XDG_CACHE_HOME/<APP_PKGNAME>
XDG_CONFIG_HOME/<APP_PKGNAME>
XDG_DATA_HOME/<APP_PKGNAME>
XDG_RUNTIME_DIR/confined/<APP_PKGNAME>
     

em que APP_PKGNAME é o usado no campo "nome" do manifesto de cliques. Por exemplo, se o manifesto de cliques tiver isto:

$ cat ./manifest.json
{
  "name": "com.ubuntu.developer.you.yourapp",
  ...
}
     

o aplicativo terá acesso de leitura / gravação a esses diretórios e qualquer   arquivos ou subdiretórios abaixo deles:

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
    
por Sylvain Pineau 25.04.2014 / 08:26
0

Só para esclarecer a Política de Confinamento, se você quiser escrever um arquivo no Ubuntu Touch, no seu arquivo mytype.cpp, substitua:

QString filename = "text.txt";

por:

QString filename = "/home/phablet/.local/share/your_app_name/text.txt";
    
por Antonio Sánchez 12.06.2015 / 09:51