使用URL dispatcher的范例
在上面的一篇文章中,我们介绍了怎样使用URL disptacher。在这篇文章中,我们来通过一个范例更进一步来了解怎样实现它。
1)创建一个具有URL dispatcher的应用
我们把该应用叫做“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"]
}
整个的代码在例如以下的地址能够找到:
2)创建调用应用
我们直接创建一个主要的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="">
假设“MyApp”在已经执行的情况下,能够看到例如以下的右边的画面:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVWJ1bnR1VG91Y2g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="300" alt="">
使用URL dispatcher的范例的更多相关文章
- Django 源码小剖: URL 调度器(URL dispatcher)
在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...
- URL 调度器(URL dispatcher)
URL 调度器(URL dispatcher) 在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 UR ...
- Django 源码小剖: 更高效的 URL 调度器(URL dispatcher)
效率问题 django 内部的 url 调度机制说白了就是给一张有关匹配信息的表, 这张表中有着 url -> action 的映射, 当请求到来的时候, 一个一个(遍历)去匹配. 中, 则调用 ...
- django notes 二:URL dispatcher
一般在 settings.py 中会有一个 ROOT_URLCONF ,请求到来时 django 会从 ROOT_URLCONF 指向的文件中查找 urlpatterns 变量配置的路由. url ...
- 怎样在QML应用中调用系统设置中的页面来设置我们的系统
我们在QML应用中有时须要调用系统设置(system settings)来完毕我们的一些设置.比方,我们在使用GPS来定位时,可能GPS并没有打开,假设在我们的应用中直接打开系统中的GPS设置页面,这 ...
- Django的url使用方法
利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 from django.con ...
- Django学习之十一:真正理解Django的路由分发和反解url原理
目录 URL Dispatcher 简介 模式概念 对比URLPattern 与 URLResolver (多态的体现) 构建子路由几种方式 反解url算法逻辑 URL Dispatcher 简介 d ...
- Django中URL的解析和反查
add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...
- Django 2.0 URL
Overview¶ A view is a “type” of Web page in your Django application that generally serves a specific ...
随机推荐
- xmpp 登录注册小结
将XMPPStream放在APPDelegate,以便全局访问 #pragma mark - XMPP相关的属性和方法定义 /** * 全局xmppstream,只读属性 */ @property ( ...
- 【Luogu】P3865ST表模板(ST表)
题目链接 本来准备自己yy一个倍增来着,然而一看要求O1查询就怂了. ST表模板.放上代码. #include<cstdio> #include<cstdlib> #inclu ...
- LVM 类型的 Storage Pool
LVM 类型的 Storage Pool 不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用. 不过,LV 由于没有磁盘的 MBR 引导记录,不能 ...
- Codeforces956D. Contact ATC
$n \leq 100000$个飞机在坐标轴上,给坐标给速度,坐标速度异号,还有一个风速在$[-w,w]$区间,$w$比最小的速度绝对值要小.由于风速不知道,所以问有多少对飞机可能在原点相遇. 思维定 ...
- linux下将目录授权给其他用户的步骤
1.更改目录所有者命令:chown -R 用户名称 目录名称2.更改目录权限命令:chmod -R 755 目录名称
- (8)C#连sqlserver
str="Data Source=ip; Network Library=DBMSSOCN; Initial Catalog=数据库; User ID=sa; Password=xx&quo ...
- Codeforces 713D Animals and Puzzle(二维ST表+二分答案)
题目链接 Animals and Puzzle 题意 给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...
- python入门示例程序
该实例是raspi和dsp电机运动控制板的串口uart通信: import serial class SerialHandler(): ''' raspi serial for communicati ...
- 心脏滴血漏洞复现(CVE-2014-0160)
漏洞范围: OpenSSL 1.0.1版本 漏洞成因: Heartbleed漏洞是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进 行边界检查.攻击者可以追踪OpenSSL所分配的 ...
- db2 获取自增主键的方法
1.用SEQUENCES方式 建表语句 CREATE TABLE TEST1( PKEY INTEGER NOT NULL, NAME VARCHAR(100), SEX VARCHAR(100), ...