在上面的一篇文章中,我们介绍了怎样使用URL disptacher。在这篇文章中,我们来通过一个范例更进一步来了解怎样实现它。

1)创建一个具有URL dispatcher的应用

我们首先打开我们的SDK,然后创建一个最主要的QML template应用。

我们把该应用叫做“MyApp”。

我们首先在“MyApp”的根文件夹加入一个文件叫做“MyApp.url-dispatcher”文件,这里面的内容例如以下:


[
{
"protocol": "launchmyapp"
}
]

这种定义使得不论什么在Qt.openUrlExternally()中具有以“launchmyapp:///”开头的调用,就能够打开该应用。

比方:


Qt.openUrlExternally("launchmyapp:///123");

同一时候,我们改动我们的manifest.json文件例如以下:


{
"architecture": "all",
"description": "description of MyApp",
"framework": "ubuntu-sdk-14.10-dev2",
"hooks": {
"MyApp": {
"apparmor": "MyApp.apparmor",
"desktop": "MyApp.desktop",
"urls": "MyApp.url-dispatcher"
}
},
"maintainer": "XiaoGuo, Liu <xiaoguo.liu@canonical.com>",
"name": "com.ubuntu.developer.unknown.myapp",
"title": "MyApp",
"version": "0.1"
}

注意这里的“urls”项。到这里,我们基本上就行让我们的应用可以被其他的应用调用了。为了可以得到调用应用传来的參数。我们也同一时候改动我们的desktop文件例如以下:


[Desktop Entry]
Name=MyApp
Exec=qmlscene $@ main.qml -- %u
Icon=MyApp.png
Terminal=false
Type=Application
X-Ubuntu-Touch=true

注意这里的"-- %u",这是增加的部分。

为了可以在程序中显示得到的URL信息,我们对程序做了例如以下的改动:



import QtQuick 2.0
import Ubuntu.Components 1.1 /*!
\brief MainView with a Label and Button elements.
*/ MainView {
id:root // objectName for functional testing purposes (autopilot-qt5)
objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest
applicationName: "com.ubuntu.developer.unknown.myapp" Component.onCompleted: {
mylabel.text = "aaaa";
console.log( "arg length: " + myarg.arguments.length ); if ( myarg.defaultArgument === undefined) {
mylabel.text = "undefined";
} else {
mylabel.text = "args: " + myarg.defaultArgument.at(0);
} console.log("argument: " + myarg.defaultArgument.at(0));
console.log("")
} Arguments {
id: myarg
defaultArgument.help: "Expects URL of the media to play."
defaultArgument.valueNames: ["URL"]
} /*
This property enables the application to change orientation
when the device is rotated. The default is false.
*/
//automaticOrientation: true // Removes the old toolbar and enables new features of the new header.
useDeprecatedToolbar: false width: units.gu(50)
height: units.gu(75) Page {
title: i18n.tr("MyApp") Column {
spacing: units.gu(1)
anchors {
margins: units.gu(2)
fill: parent
} Row {
spacing: units.gu(2) Label {
id: mylabel
objectName: "label" text: i18n.tr("Received parameters: ")
} Label {
id: label
objectName: "label" text: i18n.tr("")
} Connections {
target: UriHandler
onOpened: {
// root.applicationName = "good"
mylabel.text = "dddddd"; var para = "";
for (var i = 0; i < uris.length; ++i) {
// application.parseArgument(uris[i])
console.log( uris[i] );
para += uris[i];
} label.text = para;
}
}
}
}
} }

注意这里的“UriHandler”部分,当应用在执行时,url dispatcher被调用时。该部分代码会被执行。

当应用没有执行时,我们通过传人的參数从而得到输入的參数值:


    Arguments {
id: myarg
defaultArgument.help: "Expects URL of the media to play."
defaultArgument.valueNames: ["URL"]
}

整个的代码在例如以下的地址能够找到:


https://code.launchpad.net/~liu-xiao-guo/debiantrial/myapp


2)创建调用应用


这个应用事实上非常easy。

我们直接创建一个主要的QML template应用。同一时候改动我们的main.qml例如以下:


import QtQuick 2.0
import Ubuntu.Components 1.1 /*!
\brief MainView with a Label and Button elements.
*/ MainView {
// objectName for functional testing purposes (autopilot-qt5)
objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest
applicationName: "com.ubuntu.developer.unknown.launchmyapp" /*
This property enables the application to change orientation
when the device is rotated. The default is false.
*/
//automaticOrientation: true // Removes the old toolbar and enables new features of the new header.
useDeprecatedToolbar: false width: units.gu(100)
height: units.gu(75) Page {
title: i18n.tr("LaunchMyApp") Column {
spacing: units.gu(1)
anchors {
margins: units.gu(2)
fill: parent
} Button {
objectName: "button"
width: parent.width text: i18n.tr("Launch MyApp") onClicked: {
Qt.openUrlExternally("launchmyapp:///123");
}
} Button {
objectName: "button"
width: parent.width text: i18n.tr("Open MyApp") onClicked: {
Qt.openUrlExternally("appid://com.ubuntu.developer.unknown.myapp/MyApp/current-user-version");
}
}
}
}
}

这里我们使用了两种方法来调用我们的“MyApp”。第一种是通过:


 Qt.openUrlExternally("launchmyapp:///123");

这样的方法的优点是能够传人我们须要的參数,并解析,从而对于不同的參数能够得到不同的响应。


第二种方式是通过:

Qt.openUrlExternally("appid://com.ubuntu.developer.unknown.myapp/MyApp/current-user-version");

这样的方法不能解析不论什么的參数,它能够把应用启动起来。我们能够通过例如以下的方法得到应用的一些信息:



执行我们的应用:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVWJ1bnR1VG91Y2g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="300" alt="">


我们按下第一个button,假设“MyApp”没有执行时,会显演示样例如以下的在左边的画面。

假设“MyApp”在已经执行的情况下,能够看到例如以下的右边的画面:


   

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVWJ1bnR1VG91Y2g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="300" alt="">


假设,我们点击应用以下的button的话,能够看到例如以下的画面:



整个项目的源代码在例如以下的地址能够找到:


bzr branch lp:~liu-xiao-guo/debiantrial/launchmyapp





使用URL dispatcher的范例的更多相关文章

  1. Django 源码小剖: URL 调度器(URL dispatcher)

    在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...

  2. URL 调度器(URL dispatcher)

    URL 调度器(URL dispatcher) 在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 UR ...

  3. Django 源码小剖: 更高效的 URL 调度器(URL dispatcher)

    效率问题 django 内部的 url 调度机制说白了就是给一张有关匹配信息的表, 这张表中有着 url -> action 的映射, 当请求到来的时候, 一个一个(遍历)去匹配. 中, 则调用 ...

  4. django notes 二:URL dispatcher

    一般在 settings.py 中会有一个  ROOT_URLCONF ,请求到来时 django 会从 ROOT_URLCONF 指向的文件中查找  urlpatterns 变量配置的路由. url ...

  5. 怎样在QML应用中调用系统设置中的页面来设置我们的系统

    我们在QML应用中有时须要调用系统设置(system settings)来完毕我们的一些设置.比方,我们在使用GPS来定位时,可能GPS并没有打开,假设在我们的应用中直接打开系统中的GPS设置页面,这 ...

  6. Django的url使用方法

    利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 from django.con ...

  7. Django学习之十一:真正理解Django的路由分发和反解url原理

    目录 URL Dispatcher 简介 模式概念 对比URLPattern 与 URLResolver (多态的体现) 构建子路由几种方式 反解url算法逻辑 URL Dispatcher 简介 d ...

  8. Django中URL的解析和反查

    add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...

  9. Django 2.0 URL

    Overview¶ A view is a “type” of Web page in your Django application that generally serves a specific ...

随机推荐

  1. FZU 2186 小明的迷宫 【压状dp】

    Problem Description 小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫.因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷 ...

  2. POJ 2279

    线性DP 本题的正解是杨氏矩阵与钩子定理 但是这道题用DP的思想非常好 但是这样会MLE... #include <iostream> #include <cstdio> #i ...

  3. 转载 cc、gcc、g++、CC的区别概括

    gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...

  4. hdu 3594 Cactus /uva 10510 仙人掌图判定

    仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...

  5. collection包1.1.0都升级了什么功能

    collection包1.1.0都升级了什么功能 jianfengye/collection(https://github.com/jianfengye/collection) 这个包喜迎第一个子版本 ...

  6. P1540 机器翻译(STL 链表)

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  7. [转] SQL Server中变量的声明和使用方法

    原文地址 SQL Server中变量的声明和使用方法 声明局部变量语法: DECLARE @variable_name DataType 其中 variable_name为局部变量的名称,DataTy ...

  8. 解决asp.net core 日期格式 datetime Json返回 带T的问题

    原文:解决asp.net core 日期格式 datetime Json返回 带T的问题 记录一下: Startup中,将 services.AddMvc(); 改为: services.AddMvc ...

  9. 【Todo】Java8新特性学习

    参考这篇文章吧: http://blog.csdn.net/vchen_hao/article/details/53301073  还有一个系列

  10. win7下 安装 source code pro

    转: http://my.oschina.net/yearnfar/blog/325107 source code pro 字体安装, 一. 去 https://github.com/adobe-fo ...