彩票走势图

C++界面开发套包Qt实例教程:Intents系统UI和应用程序示例

翻译|实施案例|编辑:鲍佳佳|2020-09-18 12:21:29.850|阅读 671 次

概述:此示例包含一个系统UI和三个示例应用程序,总共产生了四个单独的QML应用程序。每个应用程序都放置在其自己的单独目录中。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

Qt(发音为“ cute”,而不是“ cu-tee”)是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt最新试用版>>

点击获取更多文章教程

通过Intent进行通信的三个应用程序和一个系统UI。

所有应用程序都在运行的Intents示例。
文件和文件夹结构

此示例包含一个系统UI和三个示例应用程序(“Red Intents”,“Green Intents”和“Blue Intents”),总共产生了四个单独的QML应用程序。

每个应用程序都放置在其自己的单独目录中,如下所述。由于所有应用程序和系统UI都使用基于QtQuickControls 2的UI,因此其组件位于共享目录中。

  • system-ui.qml
  • apps
    • intents.blue
      • icon.png
      • info.yaml
      • main.qml
    • intents.red
      • icon.png
      • info.yaml
      • main.qml
    • intents.green
      • icon.png
      • info.yaml
      • main.qml
  • shared
    • IntentsApplicationWindow.qml
    • IntentsUIPage.qml

运行示例

假设appman可执行文件在您的路径中,则可以按以下方式运行系统UI:

examples/applicationmanager/intents$ appman --builtin-apps-manifest-dir ./apps system-ui.qml

添加-o "ui: { style: material }"将使示例的外观更好看。

如下图所示:

所有应用程序都在运行的Intents示例。

有关这些和其他命令行选项的信息,您可以运行appman --help或查看配置文档。

应用实施

所有应用程序(红色,绿色和蓝色)都是相同的,它们main.qml只是实例化共享的IntentsApplicationWindow组件。

import "../../shared" "../../shared"

IntentsApplicationWindow { }{ }

IntentsApplicationWindow组件其UI内容是通过实例化该IntentsUIPage组件来定义的,该组件也可以共享。这个UI组件没有任何特定于意图的代码,因此实际的发送是在附加到IntentsUIPage请求信号的信号处理程序中完成的:

onRequest: { {
    var request = var request = IntentClient.sendIntentRequest(intentId,  applicationId,  parameters)
    
    request.onReplyReceived.connect(function() {
         {
        intentPage.setResult(request.requestId,  request.succeeded,
                             
                             request.succeeded ? ? request.result : : request.errorMessage)
    })})
}}

在使用在UI中选择的参数调用IntentClient :: sendIntentRequest之后,示例代码会将函数对象连接到请求的ReplyReceived信号。结果放置在UI 的“ request”字段中。

另外,它为应用程序定义了所有必需的IntentHandlers,例如:

IntentHandler {
    {
    intentIds:  "rotate-window"
    onRequestReceived: {
         {
        rotationAnimation.start()
        
        request.sendReply({ "done":  "done": true })})
    }}
}}

这些intent处理程序并不复杂,每个intent处理程序仅触发一个也在此文件中定义的基本动画,因此对于rotate-window意图而言,如下:

RotationAnimation on  on rotation {
    {
    id:  rotationAnimation
    running:  false
    duration:  500;  from:  0;  to:  360
}}

在QML中,仅实现IntentHandlers是不够的,因为应用程序管理器需要了解有关哪个应用程序支持哪些意图的信息。在应用程序运行之前,此信息必须对应用程序管理器可用,以便于根据intent请求自动启动应用程序。对于应用程序管理器中的所有其他应用程序配置,这都是通过应用程序的清单文件完成的info.yaml:

将红色应用定义了三个可用的intent:

intents::
- id: rotate-window- id: rotate-window
  name::
    en: Rotate Red: Rotate Red
- id: scale-window- id: scale-window
  name::
    en: Scale Red: Scale Red
- id: blink-window- id: blink-window
  name::
    en: Blink Red: Blink Red

此外,红色应用程序获得了该call-blue功能,这是蓝色应用程序中某些intent所必需的。

capabilities: 'call-blue': 'call-blue'

绿色应用程序定义只有两个可用的意图。需要注意的是,即使该应用程序有一个IntentHandler的blink-window intents通过共享IntentsApplicationWindow组件,此处理程序不会被调用,因为这个intents ID没有通过info.yaml清单在系统中注册:

intents::
- id: rotate-window- id: rotate-window
  name::
    en: Rotate Green: Rotate Green
- id: scale-window- id: scale-window
  name::
    en: Scale Green: Scale Green

蓝应用程序最复杂的intents定义。除了处理与Red应用程序相同的三个blue-window-privateIntent之外,它还注册具有属性的Intent visibility: private。只能从注册它们的同一应用程序中请求私有意图,因此在这种情况下,只有Blue可以成功请求该blue-window-private意图。此外,rotate-window仅具有此call-blue功能的应用程序可以请求该意图:此处,红色应用程序具有所需的功能,而绿色应用程序则没有。

intents::
- id: rotate-window- id: rotate-window
  name::
    en: Rotate Blue: Rotate Blue
  requiredCapabilities: [ 'call-blue' ]: [ 'call-blue' ]
- id: scale-window- id: scale-window
  name::
    en: Scale Blue: Scale Blue
- id: blink-window- id: blink-window
  name::
    en: Blink Blue: Blink Blue
- id: blue-window-private- id: blue-window-private
  name::
    en: Blue Private Intent: Blue Private Intent
  visibility: private: private
系统用户界面实现

除了用于启动和停止应用程序的左侧栏之外,系统界面还具有两个用于处理意图机制的特殊功能:

  • 在系统用户界面中处理意图
  • 消除意图请求的歧义

在系统界面中处理intent

intents不仅可以在应用程序中处理,而且可以在系统UI中处理。由于系统UI始终在运行,因此我们不需要依赖info.yaml清单文件来定义支持的intents,而是可以直接将所需的元数据声明为IntentServerHandler组件的属性。该IntentServerHandler实际上是源自IntentHandler,所以它的工作方式为应用端计数器部分相同的:它只会用所需的属性来定义所有元数据(例如names,icon...)。


IntentServerHandler {
    {
    intentIds:  "rotate-window"
    names: { "en":  { "en": "Rotate System UI" }
    }
    visibility:  IntentObject.Public

    onRequestReceived: {
         {
        rotationAnimation.start()
        
        request.sendReply({ "wasRequestedBy":  "wasRequestedBy": request.requestingApplicationId })})
    }}
}}


处理程序回调与应用程序中的回调几乎相同。这里唯一值得注意的区别是,我们可以访问requestingApplicationId来标识请求的来源。出于安全原因,该数据不适用于应用程序中的intents处理程序。

消除意图请求的歧义

该示例实现了一个UI,使用户可以选择如何消除传入的intents请求的歧义。在此处完成IntentServer的消歧请求的注册:


Connections {
    {
    target:  IntentServer
    function  onDisambiguationRequest(requestId, potentialIntents) {
        requestId, potentialIntents) {
        disambiguationDialog.add(requestId,  potentialIntents)
    }}
}}


由于我们希望在系统中并行intents请求的数量方面保持灵活性,因此我们仅将传入请求添加到队列(allRequests)中。将Dialog消耗该队列是一个相当标准的QtQuickControls 2对话框,让你展示你的应用程序可能选择从IntentServer :: disambiguationRequested()信号来一个漂亮的UI。在按下OkCancel之后,对话框将通知IntentServer用户选择:


onAccepted: {
     {
    IntentServer.acknowledgeDisambiguationRequest(currentRequest.requestId,
                                                  
                                                  currentRequest.intents[handlingApplications.currentIndex]);
    
    showNext()
}}
onRejected: {
     {
    IntentServer.rejectDisambiguationRequest(currentRequest.requestId)
    
    showNext()
}}


本篇文章中的内容你都学会了吗?如果这篇文章没能满足你的需求、点击获取更多文章教程!现在立刻下载Qt免费试用吧!更多Qt类开发工具QtitanRibbonQtitanChartQtitanNavigationQtitanDockingQtitanDataGrid在线订购现直降1000元,欢迎咨询慧都获取更多优惠>>


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP