Pembaruan: Untuk 14,04 lihat jawaban yang paling disederhanakan oleh int_ua.
Teks asli:
Di http://talk.maemo.org/showthread.php?t=87580 ada ikhtisar dasar tentang cara menambahkan ekstensi ke QML. Saya memutuskan untuk mencobanya menggunakan ubuntu-sdk sebagai gantinya, yang sedikit berbeda. Saya akan mendokumentasikan di bawah ini.
Untuk proyek ini saya memilih Ubuntu Touch / Simple UI dengan C ++ Backend di QtCreator. Ini menciptakan sebuah proyek dengan dua bagian terpisah, backend dan touchui frontend yang ditulis dalam QML. Untuk backend kita akan menambahkan dua file untuk kelas 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;
}
Kelas ini hanya menggunakan QProcess untuk menjalankan suatu program, menunggu sampai selesai, membaca stdout-nya, dan mengembalikannya sebagai string.
Selanjutnya kita perlu memodifikasi backend / backend.cpp untuk memasukkan kelas. Ini membutuhkan dua baris. Tambahkan sebuah termasuk:
#include "launcher.h"
dan di BackendPlugin :: registerTypes tambahkan baris:
qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");
Seharusnya sudah ada baris untuk MyType, yang merupakan contoh yang disertakan. Setelah ini, kita harus dapat membangun backend. Satu-satunya yang tersisa adalah menggunakannya di file main.qml. Untuk ini saya menambahkan baris:
Launcher { id: myLauncher }
dan ke handler onClick Button, atur:
myType.helloWorld = myLauncher.launch("date");
Pada titik ini yang tersisa hanyalah memulai dan mengujinya. Di sinilah saya mengalami masalah, karena QtCreator tampaknya tidak mengatur semuanya dengan benar secara default. Saat saya mengatasinya, di terminal navigasikan ke direktori proyek QtCreator Anda dan:
mkdir -p Ubuntu/Example
Kemudian salin file libUbuntuExample.so dari ProjectBuildDir / backend ke Ubuntu / Contoh, dan file qmldir dari ProjectName / backend / qmldir. Maka Anda dapat menjalankan:
qmlscene -I . ProjectName/touchui/main.qml
Saya yakin mungkin ada cara sederhana untuk mengatur semua ini sehingga Build / Run berfungsi.