Actualización: para 14.04 ver la respuesta simplificada de int_ua.
Texto original:
En http://talk.maemo.org/showthread.php?t=87580 hay una descripción básica de cómo agregar la extensión a QML. Decidí intentarlo usando ubuntu-sdk, que es ligeramente diferente. Lo documentaré a continuación.
Para este proyecto, seleccioné Ubuntu Touch / Simple UI con C ++ Backend en QtCreator. Esto crea un proyecto con dos partes separadas, el backend y la interfaz táctil escrita en QML. Al backend vamos a agregar dos archivos para la clase 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;
}
Esta clase simplemente usa QProcess para ejecutar un programa, espera a que termine, lee su stdout y lo devuelve como una cadena.
A continuación, debemos modificar backend / backend.cpp para incluir la clase. Esto requiere dos líneas. Añadir un incluir:
#include "launcher.h"
y en BackendPlugin :: registerTypes agregue una línea:
qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");
Ya debería haber una línea para MyType, que es el ejemplo incluido. Después de esto, deberíamos poder construir el backend. Lo único que queda es usarlo en el archivo main.qml. Para esto agregué una línea:
Launcher { id: myLauncher }
y para el controlador onClick del botón, establezca:
myType.helloWorld = myLauncher.launch("date");
En este punto, todo lo que queda es iniciarlo y probarlo. Aquí es donde me encontré con un problema, ya que QtCreator no parece configurar todo correctamente de forma predeterminada. Mientras soluciono, en la terminal navegue a su directorio de proyecto QtCreator y:
mkdir -p Ubuntu/Example
Luego copie el archivo libUbuntuExample.so de ProjectBuildDir / backend a Ubuntu / Example, y el archivo qmldir de ProjectName / backend / qmldir. Entonces puedes ejecutar:
qmlscene -I . ProjectName/touchui/main.qml
Estoy seguro de que probablemente haya una forma simple de arreglar todo esto, así que Build / Run simplemente funciona.