为QML动态生成Tab
来源:互联网 发布:使用java制作电脑程序 编辑:程序博客网 时间:2024/05/22 01:53
在QML设计中,Tabs是构成QML应用的一种UI架构。在今天的这篇文章中,我们来尝试来动态创建一些Tab。
我们先把代码贴出来:
import QtQuick 2.0import Ubuntu.Components 1.1import QtQuick.LocalStorage 2.0/*! \brief MainView with a Label and Button elements.*/MainView { id: mainView // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "dynamictab.liu-xiao-guo" /* 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(85) Component.onCompleted: { mainView.initializeDB(); mainView.saveFeed("BBC News","http://feeds.bbci.co.uk/news/rss.xml"); mainView.saveFeed("Jono Bacon","http://www.jonobacon.org/?feed=rss2"); mainView.saveFeed("The Register", "http://www.theregister.co.uk/headlines.atom"); fillTabs(); } Tabs { id: initialtabs anchors.fill: parent// // First tab begins here// Tab {// id: tabFrontPage// objectName: "tabFrontPage"// title: i18n.tr("Front Page")// // Tab content begins here// page: Page {// Column {// anchors.centerIn: parent// Label {// id: labelFrontPage// text: i18n.tr("This will be the front page \n An aggregation of the top stories from each feed")// }// }// }// } } function fillTabs() { initialtabs.destroy(); var objStr = "import QtQuick 2.0; import Ubuntu.Components 1.1; import QtQuick.XmlListModel 2.0; Tabs{ id:tabs; anchors.fill:parent;" var db = getDatabase(); db.transaction(function(tx) { var rs = tx.executeSql('SELECT * FROM feeds;'); if (rs.rows.length > 0) { for(var i = 0; i < rs.rows.length; i++) { objStr += "Tab { id:tab" + i + ";anchors.fill:parent;title:'" + rs.rows.item(i).feedName + "'; property string source: '" + rs.rows.item(i).feedURL + "'; page: Page { anchors.margins: units.gu(2);Column {anchors.centerIn: parent; Label{text:tab" + i + ".source;}}}}"; } objStr += "}"; console.log("objStr: " + objStr ); var cmpTabs = Qt.createQmlObject(objStr, mainView, "tabsfile"); } else { res = "Unknown"; } }) } //Create tabs for each feed function createTabs() { var feeds = getFeeds(); for (var i = 0; i < feeds.length; i++){ //Add tab for each feed. // Cannot be done with existing API } } //Storage API function getDatabase() { return LocalStorage.openDatabaseSync("news-feed","1.0","StorageDatabase",10000) } //Initialise DB tables if not already existing function initializeDB() { var db = getDatabase(); db.transaction(function(tx) { //Create settings table if not existing tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)'); tx.executeSql('CREATE TABLE IF NOT EXISTS feeds(feedName TEXT UNIQUE, feedURL TEXT UNIQUE)') }); } //Write setting to DB function setSetting(setting,value){ //setting: string - setting name (key) //value: string - value var db = getDatabase(); var res = ""; db.transaction(function(tx) { var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);',[setting,value]); //console.log(rs.rowsAffected) if(rs.rowsAffected > 0) { res = "OK"; } else { res = "Error"; } }) return res; } //Read setting from DB function getSetting(setting) { var db = getDatabase(); var res=""; db.transaction(function(tx) { var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]); if (rs.rows.length > 0) { res = rs.rows.item(0).value; } else { res = "Unknown"; } }) // The function returns “Unknown” if the setting was not found in the database // For more advanced projects, this should probably be handled through error codes return res; } function saveFeed(feedName, feedURL) { var db = getDatabase(); var res = ""; db.transaction(function(tx){ var rs = tx.executeSql('INSERT OR REPLACE INTO feeds VALUES (?,?)',[feedName,feedURL]); //console.log(rs.rowsAffected) if (rs.rowsAffected > 0) { res = "OK"; } else { res = "Error"; } }) return res; } //Return a single feed function getFeed(feedName) { var db = getDatabase(); var res = ""; db.transaction(function(tx) { var rs = tx.executeSql('SELECT feedURL FROM feeds WHERE feedName=?;', [feedName]); if (rs.rows.length > 0) { res = rs.rows.item(0).feedURL; } else { res = "Unknown"; } }) return res; } //Return all feeds and urls function getFeeds() { var db = getDatabase(); var res = ""; db.transaction(function(tx) { var rs = tx.executeSql('SELECT * FROM feeds;'); if (rs.rows.length > 0) { return rs; } else { res = "Unknown"; } }) return res; }}
这里,我们们先创建一个自己的数据库来存储一些RSS feed的值:
Component.onCompleted: { mainView.initializeDB(); mainView.saveFeed("BBC News","http://feeds.bbci.co.uk/news/rss.xml"); mainView.saveFeed("Jono Bacon","http://www.jonobacon.org/?feed=rss2"); mainView.saveFeed("The Register", "http://www.theregister.co.uk/headlines.atom"); fillTabs(); }
在上面的最后部分,我们调用fillTabs来动态创建一些我们想要的Tab:
function fillTabs() { initialtabs.destroy(); var objStr = "import QtQuick 2.0; import Ubuntu.Components 1.1; import QtQuick.XmlListModel 2.0; Tabs{ id:tabs; anchors.fill:parent;" var db = getDatabase(); db.transaction(function(tx) { var rs = tx.executeSql('SELECT * FROM feeds;'); if (rs.rows.length > 0) { for(var i = 0; i < rs.rows.length; i++) { objStr += "Tab { id:tab" + i + ";anchors.fill:parent;title:'" + rs.rows.item(i).feedName + "'; property string source: '" + rs.rows.item(i).feedURL + "'; page: Page { anchors.margins: units.gu(2);Column {anchors.centerIn: parent; Label{text:tab" + i + ".source;}}}}"; } objStr += "}"; console.log("objStr: " + objStr ); var cmpTabs = Qt.createQmlObject(objStr, mainView, "tabsfile"); } else { res = "Unknown"; } }) }
运行我们的应用:
当然我们也可以利用我们存储的rss feed的值来创建一个完全新的RSS reader。具体下面的开发就留给开发者吧。我们也可以使用Qt.createComponent从一个文件中来创建一个我们所需要的tab。
整个项目的源码在:https://github.com/liu-xiao-guo/dynamictab
0 0
- 为QML动态生成Tab
- Qml TabView 如何动态创建Tab
- qml为TableView动态插入列
- 动态生成的tab选项卡功能
- 在QML中利用Javascript动态生成画面
- 在String Tab指定资源ID,动态生成控件
- angular 利用控制器中的变量动态生成tab选项卡
- 如何动态为 tabstrip 中的 tab 页签指定标题
- 动态创建qml
- QML - 动态柱状图
- qml 动态创建TableView
- Qml动态语言切换
- QML之动态加载
- 如何在QML应用中动态修改ListModel中的数据并存储它为JSON格式
- 为动态生成节点绑定事件
- jquery 为动态生成元素绑定事件
- jquery为动态生成的元素生成click事件
- QML如何创建动态组件
- Android Studio 简单介绍和使用问题小结
- Android:HttpGet与HttpPost
- 快速卷积
- doPost与doGet的区别
- DataTables从入门到精通
- 为QML动态生成Tab
- 某CEO将公司最低工资提到7万美金,自己降薪90%
- Ubuntu 15.04 折腾手记(3)
- jquery定时器
- Android中为什么不提供双击事件的接口
- NOI 2015 荷马史诗
- shader编程学习(2)遮挡显示
- Datatables从入门到精通(案例一)
- 计划策略-25-具有配置的订货型生产