如何在Ubuntu手机上实现一个FileDialog

前一段时间,有个开发者问我能否在Ubuntu手机中使用QtQuick.Dialogs来实现FileDialog。目前在手机上没有Qt这个库的实现。最主要的原因是它不使用unit grid的方式来布局,所以在真的手机上显得非常小。那么我们怎么才能实现同样的功能呢?

我们首先来查看一下我们的Ubuntu Qt所提供的API Dialog。这里我们有提供一个Dialog的control.我们可以仿照上面的例程来写出我们所需要的例程。另外,我们也需要使用另外一个APIFolderListModel。通过这个API我们可以得到我们所需要的文件的目录的所有的文件:

通过对这两个API的了解和和使用,我们可以很快的做出如下的测试应用:

import QtQuick 2.0
import Ubuntu.Components 1.1
import Ubuntu.Components.Popups 0.1
import Qt.labs.folderlistmodel 2.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: "filedialog.ubuntu"

    /*
     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(60)
    height: units.gu(75)

    Page {
        title: i18n.tr("Simple")

        Button {
            id: launcher
            text: i18n.tr("Open")
            width: units.gu(16)
            onClicked: PopupUtils.open(dialog, null)
        }

        Component {
            id: dialog
            Dialog {
                id: dialogue

                title: "FileList Dialog"
                text: "Show the files"

                ListView {
                    id: listview
                    width: parent.width
                    height: 200

                    FolderListModel {
                        id: folderModel
                        nameFilters: ["*.qml"]
                    }

                    Component {
                        id: fileDelegate
                        Text {
                            id: text
                            text: fileName
                            MouseArea {
                                anchors.fill: parent
                                onClicked: {
                                    console.log("it is clicked");
                                    listview.currentIndex = index;
                                }
                            }
                        }
                    }

                    // Define a highlight with customized movement between items.
                    Component {
                        id: highlightBar
                        Rectangle {
                            width: fileDelegate.width; height: 50
                            color: "red"
                            y: listview.currentItem.y;
                            Behavior on y { SpringAnimation { spring: 2; damping: 0.1 } }
                        }
                    }

                    focus: true
                    model: folderModel
                    delegate: fileDelegate
                    highlight: highlightBar

                }

                Row {
                    id: row
                    width: parent.width
                    spacing: units.gu(1)
                    Button {
                        width: parent.width/2
                        text: "Cancel"
                        onClicked: PopupUtils.close(dialogue)
                    }

                    Button {
                        width: parent.width/2
                        text: "Confirm"
                        color: UbuntuColors.green
                        onClicked: {
                            console.log("caller: " + dialogue.caller);
                            console.log("currentIndex: " + listview.currentIndex);
                            console.log(folderModel.get(listview.currentIndex, "fileName"));
                            launcher.update();
                            PopupUtils.close(dialogue)
                        }
                    }
                }
            }
        }
    }
}

运行我们的应用,我们可以看到:

  

这里必须指出的是FolderListModel并不是可以访问系统的任何一个目录的。我们可以参考文章“Ubuntu OS应用Runtime Enviroment”来得到哪些目录是可以访问的。对访问另外一个应用所拥有的文件来说,我们可以通过使用contenthub来访问。

所有应用的源码在:git clone https://gitcafe.com/ubuntu/filedialog.git

时间: 2024-08-11 09:48:35

如何在Ubuntu手机上实现一个FileDialog的相关文章

如何在Ubuntu手机中使得一个应用是全屏的应用

我们知道很多的开发者想把自己的应用设置为全屏的应用,这样可以使得应用能更多地占用屏幕的有效面积以使得自己的应用更好看.在默认的SDK的样板中,在应用的最上面,有一个"title"的地方占用很多的空间.对于一些应用来说,在主界面中,这个可能并不有用,但是对于使用PageStack的应用来说,这个区域显示一个向左的箭头以返回上一个页面的. 最近我也有这样的问题,我既想使用PageStack给予我的方便,又想拥有全屏的功能.在这篇文章中,我们来介绍如何做到全屏的应用.另外我们值得指出的是:我

如何在Ubuntu OS上开发Scope (视频)

在这个视频里,我来介绍如何利用Ubuntu SDK从零开始在Ubuntu OS上开发一个视频.如果大家想看文章的话,请参阅文章"在Ubuntu OS上创建一个dianping Scope (Qt JSON)". 视频的地址在:http://v.youku.com/v_show/id_XODM5ODIxMDgw.html. 视频的源码在:bzr branch lp:~liu-xiao-guo/debiantrial/dianpingvideo 如果大家有什么意见或不清楚的,欢迎大家进行评

怎么在Ubuntu手机上发送短信及拨打电话

由于一些平台安全性的原因,Ubuntu手机目前暂时没有提供供第三方开发者发送短信及拨打电话的接口,但是在实际的应用中,我们也许会需要用到发送短信息或拨打电话.这个时候我们怎么办呢?我们在前面的文章"使用URL dispatcher的范例"中已经介绍了如何使用url dispatcher来调用第三方应用的方法.这里我们用该方法来展示如何在我们的应用中发送短信息及拨打电话. 首先,我们创建一个最简单的"App with Simple UI"模版应用,并修改我们的&quo

如何在Ubuntu手机click包中打入第三方应用库

由于Ubuntu手机平台安全的限制,在Ubuntu手机的应用中我们只能访问自己的空间.如果我们所需要访问的文件不存在于我们应用所在的空间,我们是没有办法访问到的.我们的应用只能访问系统提供的库.如果系统没有所需要的库的话,我们通过可以通过如下的方法实现: 在我的应用中把应用的所需要的第三方的源码放入到我的应用项目中,并形成plugin(通常是C++代码)从而被应用调用 在我们的应用中把第三方的库打包进我们的应用包中,并在我的plugin(通常是C++代码)中调用,进而被应用调用 我们可以选择Ub

如何在Ubuntu手机中使用前置照相机

我们可以在Ubuntu QML的API文档中看到Camera的用法,但是里面没有写到任何的前置Camera的调用方法.对于一些应用来说,前置Camera的使用是重要的.我们必须使用Qt C++代码来实现这个功能.在这篇文章中,我们来介绍如何使用Ubuntu手机中的前置照相机. 1)创建一个最基本的QML应用         这样我们就生成了一个含有plugin的项目. 2)在项目中加入CameraSelector来选择照相机 为了能够调用Camera的一些API,我们在plugin中加入如下的C

如何在Ubuntu/CentOS上安装Linux内核4.0

大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0.代号为‘Hurr durr I'm a sheep’的Linux内核4.0是目前为止最新的主干内核.它是稳定版3.19.4之后发布的内核.4月12日是所有的开源运动爱好者的大日 子,Linux Torvalds宣布了Linux内核4.0的发布,它现在就已经可用了.由于包括了一些很棒的功能,例如无重启补丁(实时补丁),新的升级驱动,最新的 硬件支持以及很多有趣的功能都有新的版本,它原本被期望是一次重要版本.但是实

如何在Ubuntu手机中监测网络的连接信息

我们知道对于很多的网路应用来说,网路的连接信息对于我们来说非常重要.我们有必要对网路的连接信息进行监测.一旦网路连接断开,我们需要提醒用户或做一些处理.在Ubuntu平台上,我们可以使用connectivity库来查看. 我们可以利用SDK的模版来创建一个最简单的QML应用.因为我们要使用connectivity,所以我们必须加入"connectivity"的security policy. 在我们的开发者网站上虽然也有NetworkStatus的介绍,但是可能并不是很全,我们可以使用

如何在Ubuntu手机应用中得到所有的环境变量值

我们在先前的例程中已经通过一些方法得到我们应用的一些环境变量值.这些值有的非常有用,比如我们可以得到我们应用所只能访问的目录.在今天的例程中,我们来展示一种方法可以得到应用所有的环境变量.在我们的实际应用中,我们可以通过这些环境变量来做一些事情.另外,在这个例程中,我们也展示了如何在Qt C++的代码中构造我们的ListView中的model.我们在先前的例程"Ubuntu OS应用Runtime Enviroment"已经展示了和我们平台安全相关的一些环境变量. 首先,我们来展示我们

如何在ubuntu 系统上为 php 加上 redis 扩展

最近一个项目,,想用redis 作为数据库,php是不待redis 扩展,必须安装,怎么安装呢?我在网上找的很多资料发现都是预编译的,但都没成功,于是就找了另外一种方法是不需要编译直接安装就可以了 安装好后重启nginx ,php5-fpm, 重启nginx sudo /etc/init.d/nginx restart 重启php5-fmp sudo /etc/init.d/php5-fpm restarty phpinfo 在网页上显示: reids 看有没有 php 操作 redis 还必须