Оновлення: 14.04 див. Значно спрощену відповідь від int_ua.
Оригінальний текст:
На http://talk.maemo.org/showthread.php?t=87580 наведено основний огляд того, як додати розширення до QML. Я вирішив зробити знімок, використовуючи натомість ubuntu-sdk, який трохи відрізняється. Я документую нижче.
Для цього проекту я вибрав Ubuntu Touch / Simple інтерфейс користувача з C ++ Backend у QtCreator. Це створює проект із двох окремих частин, бекенда та сенсорного фронту, написаних у QML. До бекенда ми додамо два файли для класу 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 "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 просто працює.