Ich möchte einen Systembefehl in meiner Anwendung ausführen. Es wird angenommen, dass Sie einen Befehl mit SSH auf einem Remote-Server ausführen. Aber darum geht es nicht wirklich. Der Punkt ist, dass ich nicht weiß, wie man irgendeinen Befehl von der App aus ausführt. Ich habe in der Mailingliste nachgefragt und sie haben mich angewiesen, eine QML-Erweiterung mit C ++ zu erstellen. Aber ich kenne C ++ nicht und es scheint, dass ich so viel lernen muss, nur um einen einfachen Befehl auszuführen.
In Python (wie in PHP) ist es einfach, einen Systembefehl auszuführen. Gibt es eine andere Möglichkeit, dies in meiner Touch-App zu tun, oder gibt es jemanden, der mir noch weiterhelfen könnte? Oder vielleicht eine bessere Lösung für mein Problem?
application-development
ubuntu-touch
c++
qml
Daniel Holm
quelle
quelle
Antworten:
Dies wird von QML nicht unterstützt. Die typische Antwort besteht darin, ein C ++ - Plugin zu schreiben, um mit solchen Dingen umzugehen.
Das SDK-Team plant jedoch verschiedene Erweiterungen, die QML-App-Entwicklern zur Verfügung gestellt werden sollen. Diese werden möglicherweise in einem generischen Plug-in implementiert, das Sie verwenden können.
quelle
Update: Für 14.04 siehe die stark vereinfachte Antwort von int_ua.
Original Text:
Unter http://talk.maemo.org/showthread.php?t=87580 finden Sie eine grundlegende Übersicht über das Hinzufügen der Erweiterung zu QML. Ich habe beschlossen, es mit dem Ubuntu-SDK zu versuchen, was etwas anders ist. Ich werde unten dokumentieren.
Für dieses Projekt habe ich Ubuntu Touch / Simple UI mit C ++ Backend in QtCreator ausgewählt. Dadurch wird ein Projekt mit zwei separaten Teilen erstellt, dem Backend und dem Touchui-Frontend, die in QML geschrieben sind. Im Backend werden wir zwei Dateien für die Launcher-Klasse hinzufügen.
launcher.h:
launcher.cpp:
Diese Klasse verwendet einfach QProcess, um ein Programm auszuführen, wartet, bis es beendet ist, liest die Standardausgabe und gibt sie als Zeichenfolge zurück.
Als nächstes müssen wir backend / backend.cpp ändern, um die Klasse einzuschließen. Dies erfordert zwei Zeilen. Füge ein Include hinzu:
und in BackendPlugin :: registerTypes füge eine Zeile hinzu:
Für MyType sollte bereits eine Zeile vorhanden sein. Dies ist das mitgelieferte Beispiel. Danach sollten wir das Backend erstellen können. Sie müssen es nur noch in der Datei main.qml verwenden. Dazu habe ich eine Zeile hinzugefügt:
und setzen Sie im onClick-Handler des Buttons:
An diesem Punkt muss es nur noch gestartet und getestet werden. Hier ist ein Problem aufgetreten, da QtCreator anscheinend nicht alle Einstellungen standardmäßig korrekt vornimmt. Navigieren Sie zur Umgehung des Problems im Terminal zu Ihrem QtCreator-Projektverzeichnis und:
Kopieren Sie dann die Datei libUbuntuExample.so von ProjectBuildDir / backend nach Ubuntu / Example und die Datei qmldir von ProjectName / backend / qmldir. Dann kannst du laufen:
Ich bin mir sicher, dass es wahrscheinlich einen einfachen Weg gibt, dies alles zu manipulieren, damit Build / Run einfach funktioniert.
quelle
Ubuntu 14.04
Das Konzept des QProcess Launcher-Typs funktioniert jetzt problemlos in Trusty mit
ubuntu-sdk-team
PPA. Erstellen Sie einfach einQML Extension Library + Tabbed UI
Projekt (verwenden Sie noch keine Bindestriche im Projektnamen ) und ersetzen Sie den Inhalt vonmytype.h
mytype.cpp
und ändere
qmlRegisterType
dasbackend.cpp
inBereinigen Sie als Nächstes einfach alle
MyType
Reste der QML-Dateien und fügen Sie sie hinzuwo immer du willst und
am Anfang.
Optional
Ich benutze auch diesen Wrapper:
Wenn Sie Root-Zugriff benötigen, fügen Sie hinzu
pkexec
.quelle
Sie müssen wirklich nicht viel über C ++ wissen, um auf Terminalbefehle zugreifen zu können. Fügen Sie einfach Folgendes in jede Datei ein, die mit .cpp endet, zum Beispiel runPython.cpp.
Alles, was Sie jetzt herausfinden müssen, ist, wie Sie den C ++ - Code in QML zum Laufen bringen, aber ich bin sicher, dass dies sehr gut dokumentiert ist.
Beachten Sie, dass Sie jeden beliebigen Linux-Befehl hinzufügen können, indem Sie der gleichen Syntax folgen
system("linux command");
.Hoffe das hilft!
quelle