Ano*_*non 8 qt application-development qml ubuntu-sdk ubuntu-touch
QML 目前缺乏基本的系统命令,所以我正在寻找最简单的模板来写入/tmp/text.txt
.
没有办法从 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 基本目录中具有读/写访问文件。具体来说:
Run Code Online (Sandbox Code Playgroud)XDG_CACHE_HOME/<APP_PKGNAME> XDG_CONFIG_HOME/<APP_PKGNAME> XDG_DATA_HOME/<APP_PKGNAME> XDG_RUNTIME_DIR/confined/<APP_PKGNAME>
其中 APP_PKGNAME 是点击清单的“名称”字段中使用的内容。例如,如果点击清单有这个:
Run Code Online (Sandbox Code Playgroud)$ 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