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

Я не сделал этого обновления, так как я придерживаюсь 10.04 (и если Unity станет дефолтом в более поздних версиях, я остану с Ubuntu навсегда). Тем не менее, основываясь на вопросах, которые я встречал здесь и в других местах, и моих опытах с dist-обновлениями в прошлом:

1) Горячие клавиши, sshd, apache и conffiles и / var / www и Nautilus плагины вряд ли будут затронуты.

2) Карты Gnome и конфигурации Compiz могут получить b0rked, и вы можете столкнуться с другими проблемами, связанными с видео. [3]

У вас также могут возникнуть проблемы с драйверами беспроводной сети, но в равной степени вероятность того, что в настоящее время начнется работа с учетом состояния беспроводных драйверов: ^ )

1
задан 19 April 2014 в 21:51

3 ответа

Обновление: для 14.04 см. упрощенный ответ by int_ua.

Обновление: для 14.04 см. упрощенный ответ by 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 для выполнения программы, ждет ее завершения, считывает ее stdout и возвращает ее как строку.

Далее нам нужно изменить 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
ответ дан 24 May 2018 в 22:52

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

и измените 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 \"")
}

Если вы нужен корневой доступ, добавьте pkexec.

6
ответ дан 24 May 2018 в 22:52
  • 1
    Я бы просто хотел подтвердить, что это решение отлично работает для меня. Независимо от того, какие команды вы вводите, его вывод отображается в прямоугольнике. – Akiva 19 April 2014 в 19:53

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

#include <stdlib.h>

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

Теперь вам нужно выяснить, как получить код c ++, запущенный в QML, но я уверен

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

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

2
ответ дан 24 May 2018 в 22:52

Другие вопросы по тегам:

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