更新:对于14.04,请参考int_ua提供的简化答案。
原始文本:
在http://talk.maemo.org/showthread.php?t=87580上有一个关于如何将扩展添加到QML的基本概述。我决定使用ubuntu-sdk来尝试一下,这与之略有不同。我将在下面进行记录。
对于这个项目,我在QtCreator中选择了Ubuntu Touch/Simple UI with C++ Backend。这将创建一个包含两个独立部分的项目,即后端和用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处理程序中设置:
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
我相信可能有一种简单的方法来搭建这一切,使得构建/运行变得顺利。