Запускать системные команды из приложения QML

Я хочу запустить системную команду из моего приложения. Предполагается выполнить команду на удаленном сервере, используя SSH. Но дело не в этом. Дело в том, что я не знаю, как запустить какую-либо команду из приложения. Я спросил в списке рассылки, и они направили меня на создание расширения QML с использованием C ++. Но я не знаю C ++, и мне кажется, что мне нужно многому научиться, только чтобы выполнить простую команду.

В Python (как в PHP) легко запустить системную команду. Есть ли другой способ сделать это в моем приложении Touch, или есть кто-то, кто может помочь мне еще больше? Или, может быть, есть лучшее решение моей проблемы?

16
задан 19.04.2014, 19:51

4 ответа

Это не то, что поддерживает QML, типичный ответ - написать плагин C ++ для обработки такого рода вещей.

Тем не менее, команда SDK планирует различные расширения, чтобы предоставить разработчикам приложений QML, и это может быть то, что они реализуют в универсальном плагине, который вы можете использовать.

13
ответ дан 14.10.2019, 11:10
  • 1
    Это очень ценилось бы! I' ve вместо этого начал искать способ назвать сценарий Python, но я могу только найти сценарий Python, который выполняет QML, а не наоборот. – canbax 30.04.2013, 18:01
  • 2
    То, что я наконец сделал, было то, что я внес некоторые изменения в свой webui для той же функции как новое приложение, и вытяните информацию, мне нужен от того использования XML. Довольно аккуратный. – Joost de Vries 02.05.2013, 22:59
  • 3
    I' ve попробовал понятие Средства запуска QProcess в 14,04, и это хорошо работает: askubuntu.com/a/446736/20275 – Dan Dascalescu 12.04.2014, 07:38
  • 4
    @mhall119 исправьте меня, если я неправ, но Вы не можете на самом деле сделать этого с QML по телефону из-за AppArmor. Это будет препятствовать тому, чтобы Вы делали это. – Steve Brush 08.01.2015, 21:34

Ubuntu 14.04

Концепция типа QProcess Launcher теперь работает без проблем в Trusty с ubuntu-sdk-team PPA. Просто создайте QML Extension Library + Tabbed UI проект ( пока не используйте дефисы в названии проекта ), замените содержимое

mytype.h

#ifndef LAUNCHER_H
#define LAUNCHER_H

#include <QObject>
#include <QProcess>

class Launcher : public QObject
{
    Q_OBJECT

public:
    explicit Launcher(QObject *parent = 0);
    ~Launcher();
    Q_INVOKABLE QString launch(const QString &program);

protected:
    QProcess *m_process;
};

#endif // LAUNCHER_H

mytype.cpp [1117 ]
#include "mytype.h"

Launcher::Launcher(QObject *parent) :
    QObject(parent),
    m_process(new QProcess(this))
{

}

QString Launcher::launch(const QString &program)
{
    m_process->start(program);
    m_process->waitForFinished(-1);
    QByteArray bytes = m_process->readAllStandardOutput();
    QString output = QString::fromLocal8Bit(bytes);
    return output;
}

Launcher::~Launcher() {

}

и измените qmlRegisterType в backend.cpp на

qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");

Далее, просто очистите все остатки MyType из файлов QML и добавьте

        Rectangle {

          Launcher {
             id: qprocess
          }

          Text {
            anchors.centerIn: parent
            text: qprocess.launch("which bash")
          }
        }

где угодно и

import projectname 1.0

в начале.

Необязательно

Я также использую эту обертку:

function exec(command) {
    return qprocess.launch("sh -c \"" + command + " < /dev/null \"")
}

Если вам нужен root-доступ, добавьте pkexec.

6
ответ дан 14.10.2019, 11:10

Обновление: 14.04 см. Значительно упрощенный ответ от int_ua.

Оригинальный текст:

На http://talk.maemo.org/showthread.php?t=87580 приведен общий обзор того, как добавить расширение в QML. Я решил попробовать, используя вместо этого ubuntu-sdk, который немного отличается. Я документирую ниже.

Для этого проекта я выбрал Ubuntu Touch / Simple UI с C ++ Backend в QtCreator. Это создает проект с двумя отдельными частями, бэкендом и внешним интерфейсом touchui, написанным на QML. К бэкэнду мы добавим два файла для класса Launcher.

launcher.h:

#ifndef LAUNCHER_H
#define LAUNCHER_H

#include <QObject>
#include <QProcess>

class Launcher : public QObject
{
    Q_OBJECT
public:
    explicit Launcher(QObject *parent = 0);
    Q_INVOKABLE QString launch(const QString &program);

private:
    QProcess *m_process;
};

#endif // LAUNCHER_H

launcher.cpp:

#include "launcher.h"

Launcher::Launcher(QObject *parent) :
    QObject(parent),
    m_process(new QProcess(this))
{
}

QString Launcher::launch(const QString &program)
{
    m_process->start(program);
    m_process->waitForFinished(-1);
    QByteArray bytes = m_process->readAllStandardOutput();
    QString output = QString::fromLocal8Bit(bytes);
    return output;
}

Этот класс просто использует QProcess для выполнения программы, ожидает ее завершения, читает ее стандартный вывод и возвращает его в виде строки.

Далее нам нужно изменить backend / backend.cpp, чтобы включить класс. Это требует двух строк. Добавьте include:

#include "launcher.h"

и в BackendPlugin :: registerTypes добавьте строку:

qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");

Там уже должна быть строка для MyType, которая является включенный пример. После этого мы сможем построить бэкэнд. Остается только использовать его в файле main.qml. Для этого я добавил строку:

Launcher { id: myLauncher }

и в обработчик onClick для Button установил:

myType.helloWorld = myLauncher.launch("date");

На данный момент все, что остается, - это запустить его и протестировать. Здесь я столкнулся с проблемой, так как QtCreator, похоже, не все правильно настроил по умолчанию. В качестве обходного пути, в терминале перейдите в каталог проекта QtCreator и:

mkdir -p Ubuntu/Example

Затем скопируйте файл libUbuntuExample.so из ProjectBuildDir / backend в Ubuntu / Example и файл qmldir из ProjectName / backend / qmldir , Затем вы можете запустить:

qmlscene -I . ProjectName/touchui/main.qml

Я уверен, что, вероятно, есть простой способ настроить все это так, чтобы Build / Run просто работал.

10
ответ дан 14.10.2019, 11:10

Вам действительно не нужно много знать о c ++, чтобы получить доступ к терминальным командам. Просто поместите следующее в любой файл, заканчивающийся на .cpp, например runPython.cpp.

#include <stdlib.h>

int main ()
{
    system("cd /home/user/path/to/script");
    system("python3 myScript.py");
    return 0;
}

Все, что вам нужно сейчас выяснить, - это как запустить код на С ++, работающий в QML, но я уверен, что это очень хорошо задокументировано.

Обратите внимание, что вы можете добавить любую понравившуюся вам команду linux, следуя тому же синтаксису system("linux command");.

Надеюсь, это поможет!

2
ответ дан 14.10.2019, 11:10

Теги

Похожие вопросы