在我们的Ubuntu SDK中,我们提供了QtOrganizer API接口.通过这个API我们可以来管理我们自己的日历,也可以利用这个API来导入一个日历.在今天的例程中,我们来详细了解这个API的具体的用法.在练习的开始,我们可以在我们的手机中的"日历"应用中创建一些我们所需要的事件.比如:
\
\
\
1)如何得到手机中所有的manager
\
我们可以通过这个 OrganizerModel API来列举在我们的系统中所支持的所有的managers.
\
availableManagers : list<string>
这里的每个manager对应于一个数据库.这样我们就可以对它们进行操作.在目前的MX4手机中,我们列出的manager为:
\
\
\
在上面列出了三个manager: invalid,memory及eds.这里的memory可以被用在来导入我们在文件中的一个文件,并最终形成我们可以对一个文件中的事件进行操作.当然,我们也可以实现同步的功能,或导出的动作.具体的例程可以参阅文章" Qt Quick Organizer List View Example".虽然例程中使用的API的有些接口和我们现有的会有所不同,但是我们可以实现同样的功能.在上面图中显示的"eds"就是我们的手机中自动应用"日历"所使用的manager.在接下来的操作中,我们主要来通过这个来进行剖析.
\
\
2)如何得到所有的event
\
我们可以通过 OrganizerModel中的如下方法来得到所有的event的列表:
\
items : list<OrganizerItem>
通过这个API,我们可以得到在我们的日历中所有的事件的列表:
\
\
\
就如上图所示的那样,我们可以得到所有的事件的列表信息.
\
\
3)如何得到每个事件的详细信息
\
\
我们可以通过 OrganizerItem来得到每个事件的具体信息.我们可以通过:
\
itemDetails : list<Detail>
来得到事件已经拥有的那些属性.我们可以通过如下的API来得到该项的所有的具体的信息:
\
Detail detail(type)
比如在上面图中显示的时间信息.对于一个事件来说:
\
\
\
从上面的图中可以看出来,每个事件的具体信息,并展示它所支持的具体的属性项目.我们可以尝试点击最下面的按钮"Change the description to I LOVE"来改变我们的事件的description. 修改过后的列表为:
\
\
\
\
4)如何删除一个事件
\
我们可以通过 OrganizerModel中的:
\
removeItem(OrganizerItem item)
\
来删除我们不想要的事件.在我们的应用中,我们可以通过向左滑动,显示出删除图标.点击删除图标即可达到删除的目的.
\
\
\
可以看出来,我们已经成功地删除了我们的"day event on June 8th".
\
当然我们可以更多地来explore更过的关于QtOrganizer的API接口.这个练习就留给开发者自己来做.在这里我们就只抛砖引玉地展示其中的一部分.
\
Main.qml
\
import QtQuick 2.4
import Ubuntu.Components 1.3
import QtOrganizer 5.0
MainView {
// objectName for functional testing purposes (autopilot-qt5)
objectName: "mainView"
// Note! applicationName needs to match the "name" field of the click manifest
applicationName: "organizer.liu-xiao-guo"
width: units.gu(60)
height: units.gu(85)
OrganizerModel {
id: organizerModel
endPeriod: {
var date = new Date();
date.setDate(date.getDate() + 10);
return date
}
sortOrders: [
SortOrder {
id: sortOrder
detail: Detail.EventTime
field: EventTime.startDateTime
direction: Qt
}
]
onExportCompleted: {
console.log("onExportCompleted")
}
onImportCompleted: {
console.log("onImportCompleted")
}
onItemsFetched: {
console.log("onItemsFetched")
}
onModelChanged: {
console.log("onModelChanged")
console.log("item count: " + organizerModel.itemCount)
mymodel.clear();
var count = organizerModel.itemCount
for ( var i = 0; i < count; i ++ ) {
var item = organizerModel.items[i];
mymodel.append( {"item": item })
}
}
onDataChanged: {
console.log("onDataChanged")
}
manager: "eds"
}
ListModel {
id: mymodel
}
Component {
id: highlight
Rectangle {
width: parent.width
color: "lightsteelblue"; radius: 5
Behavior on y {
SpringAnimation {
spring: 3
damping: 0.2
}
}
}
}
PageStack {
id: pagestack
anchors.fill: parent
Component.onCompleted: {
pagestack.push(main)
}
Page {
id: main
header: PageHeader {
id: pageHeader
title: i18n.tr("organizer")
}
visible: false
Item {
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
top: pageHeader.bottom
}
Column {
anchors.fill: parent
spacing: units.gu(1)
Label {
text: "Organizer managers:"
}
ListView {
id: listview
width: parent.width
height: units.gu(10)
highlight: highlight
model:organizerModel.availableManagers
delegate: Label {
width: listview.width
text: modelData
fontSize: "large"
MouseArea {
anchors.fill: parent
onClicked: {
listview.currentIndex = index
}
}
}
}
Rectangle {
id: divider
width: parent.width
height: units.gu(0.1)
color: "green"
}
ListView {
clip: true
width: parent.width
height: parent.height - divider.height - listview.height
model: mymodel
delegate: ListItem {
Label {
text: item.description
}
Label {
anchors.right: parent.right
text : {
var evt_time = item.detail(Detail.EventTime)
var starttime = evt_time.startDateTime;
console.log("time: " + starttime.toLocaleDateString())
return starttime.toLocaleDateString()
}
}
onClicked: {
detailpage.myitem = item
pagestack.push(detailpage)
}
trailingActions: ListItemActions {
actions: [
Action {
iconName: "delete"
onTriggered: {
console.log("delete is triggered!");
organizerModel.removeItem(item)
}
}
]
}
}
}
}
}
Component.onCompleted: {
console.log("manage name: " + organizerModel.manager)
}
}
Page {
id: detailpage
header: PageHeader {
id: header
title: i18n.tr("Detail page")
}
visible: false
property var myitem
Item {
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
top: header.bottom
}
Column {
anchors.fill: parent
spacing: units.gu(1)
Label {
id: col1
width: parent.width
text: "collectionId: " + detailpage.myitem.collectionId
wrapMode: Text.WordWrap
}
Label {
id: col2
width: parent.width
text: "description: " + detailpage.myitem.description
wrapMode: Text.WordWrap
}
Label {
id: col3
width: parent.width
text: "displayLabel: " + detailpage.myitem.displayLabel
wrapMode: Text.WordWrap
}
Label {
id: col4
width: parent.width
text: "guid: " + detailpage.myitem.guid
wrapMode: Text.WordWrap
}
Label {
id: col5
width: parent.width
text: "itemId: " + detailpage.myitem.itemId
wrapMode: Text.WordWrap
}
Label {
id: col6
width: parent.width
text: "itemType : " + detailpage.myitem.itemType
wrapMode: Text.WordWrap
}
Label {
id: col7
width: parent.width
text: "manager : " + detailpage.myitem.manager
wrapMode: Text.WordWrap
}
Label {
id: col8
width: parent.width
text: "modified : " + detailpage.myitem.modified
wrapMode: Text.WordWrap
}
Label {
id: col9
width: parent.width
text: "Item details are:"
}
ListView {
width: parent.width
height: parent.height - col1.height - col2.height -col3.height - col9.height -
col4.height - col5.height - col6.height - col7.height - col8.height
model: detailpage.myitem.itemDetails
delegate: Label {
text: {
switch (modelData.type) {
case Detail.Undefined:
return "Undefined";
case Detail.Classification:
return "Classification"
case Detail.Comment:
return "Comment";
case Detail.Description:
return "Description"
case Detail.DisplayLabel:
return "DisplayLabel"
case Detail.ItemType:
return "ItemType"
case Detail.Guid:
return "Guid"
case Detail.Location:
return "Location"
case Detail.Parent:
return "Parent"
case Detail.Priority:
return "Priority"
case Detail.Recurrence:
return "Recurrence"
case Detail.Tag:
return "Tag"
case Detail.Timestamp:
return "Timestamp"
case Detail.Version:
return "Version"
case Detail.Reminder:
return "Reminder"
case Detail.AudibleReminder:
return "AudibleReminder"
case Detail.EmailReminder:
return "EmailReminder"
case Detail.VisualReminder:
return "VisualReminder"
case Detail.ExtendedDetail:
return "ExtendedDetail"
case Detail.EventAttendee:
return "EventAttendee"
case Detail.EventRsvp:
return "EventRsvp"
case Detail.EventTime:
return "EventTime"
case Detail.JournalTime:
return "JournalTime"
case Detail.TodoTime:
return "TodoTime"
case Detail.TodoProgress:
return "TodoProgress"
default:
return "Unknown type"
}
}
}
}
}
Button {
anchors.bottom: parent.bottom
anchors.bottomMargin: units.gu(1)
anchors.horizontalCenter: parent.horizontalCenter
text: "Change the description to I LOVE"
onClicked: {
console.log("changing the description")
detailpage.myitem.description = "I LOVE YOU"
organizerModel.saveItem(detailpage.myitem)
}
}
}
}
}
}
\
\
整个项目的源码在: github.com/liu-xiao-gu…
\
\
\