Cập nhật: Cho 14.04 xem câu trả lời đơn giản hơn nhiều bởi int_ua.
Văn bản gốc:
Tại http://talk.maemo.org/showthread.php?t=87580 có một tổng quan cơ bản về cách thêm tiện ích mở rộng vào QML. Tôi đã quyết định cho nó một shot bằng cách sử dụng ubfox-sdk, điều này hơi khác một chút. Tôi sẽ tài liệu dưới đây.
Đối với dự án này, tôi đã chọn Ubuntu Touch / Simple UI với C ++ Backend trong QtCreator. Điều này tạo ra một dự án với hai phần riêng biệt, phần phụ trợ và phần đầu vào touchui được viết bằng QML. Đến phần cuối, chúng ta sẽ thêm hai tệp cho lớp 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;
}
Lớp này chỉ đơn giản là sử dụng QProcess để thực thi một chương trình, đợi cho nó kết thúc, đọc thiết bị xuất chuẩn của nó và trả về nó dưới dạng một chuỗi.
Tiếp theo, chúng ta cần sửa đổi backend / backend.cpp để bao gồm lớp. Điều này đòi hỏi hai dòng. Nối một bao gồm:
#include "launcher.h"
và trong BackendPlugin :: registerTypes thêm một dòng:
qmlRegisterType<Launcher>(uri, 1, 0, "Launcher");
Nên có một dòng cho MyType, đây là ví dụ đi kèm. Sau này, chúng ta sẽ có thể xây dựng phần phụ trợ. Điều duy nhất còn lại là sử dụng nó trong tệp main.qml. Đối với điều này, tôi đã thêm một dòng:
Launcher { id: myLauncher }
và đến trình xử lý onClick của Nút, đặt:
myType.helloWorld = myLauncher.launch("date");
Tại thời điểm này, tất cả những gì còn lại là khởi động nó và kiểm tra nó. Đây là nơi tôi gặp phải một vấn đề, vì QtCreator dường như không thiết lập mọi thứ theo đúng mặc định. Khi tôi giải quyết, trong thiết bị đầu cuối điều hướng đến thư mục dự án QtCreator của bạn và:
mkdir -p Ubuntu/Example
Sau đó sao chép tệp libUbfoxExample.so từ ProjectBuildDir / backend sang Ubuntu / Ví dụ và tệp qmldir từ ProjectName / backend / qmldir. Sau đó, bạn có thể chạy:
qmlscene -I . ProjectName/touchui/main.qml
Tôi chắc chắn có một cách đơn giản để khắc phục tất cả những điều này để Build / Run chỉ hoạt động.