【Qt学习】借助示例代码实现简易日历项目(二)实现按自定义标签对事项进行分类

前言

书接上文,这篇文章讲的是如何实现将日程安排按标签分类并显示,且标签可由用户自定义。

实现思路

  • 在数据库中创建一个labels表格,里面记录标签名字数据。

(注:原有的tasks表记录和日程安排有关的信息)

  • ui界面显示labels表的查询结果,如果手动输入的字段已存在,则不写入数据库,否则,ui界面的model中添加且写入数据库

(注:写入数据库是永久的,但是ui的model是动态加载的,标签列表是组件加载完成时就已经读取的,新添加了某个字段后并不会重新读取数据库中的信息并更新数据,所以需要通过手动加入到ui的model中,但是下一次重新打开并加载应用时该条记录是源于读数据库,而之前对model的操作已经失效,保证了在用户层面只会看到标签被添加后立即生效且之后也不失效)

  • 在待办事项表格中新增label列,每次查询数据时用label作为tasks表的查询条件

实现方案

使用ComboBox展示标签列表

基础知识

关于ComboBox

ComboBox是Qt中自带的一个组件,在界面上体现为一个单选的下拉框。其基本形式如下:

qml 复制代码
 ComboBox {
     id:xxx
     model: ["First", "Second", "Third"]
 }

其中model里的就是它要展示的数据,数据类型可以是多种,像这样的字符串、Integer、ListModel、js形式的数组等等都可以。

还有一些常用属性,比如editable: editable: true

如果想要实现新增标签功能则可以在qml写入如下js代码(非ui.qml文件中!)

qml 复制代码
id.onAccepted: {
         if (find(editText) === -1)
             model.append({text: editText})
     }

其中id是ComboBox定义的id值。

而对于复杂一些的元素类型,比如ListModel中的ListElement,例如:

qml 复制代码
 ListModel {
     id: fruitModel

     ListElement {
         name: "Apple"
         cost: 2.45
     }
 }

则要注意,name和cost等是该元素的一个属性,后续展示某个属性值的时候,对应属性的名称一定不要写错或者混用,否则就无法显示数据。

关于同一项目下一个A.qml调用B.qml文件定义的组件及其属性

步骤:

  • 在A.ui.qml代码中实例化B.qml
css 复制代码
//A.ui.qml中的代码
B{
    id:b
}
  • 假设B有一个函数是func(),在A.qml代码的方法中可以直接调用:b.func()

Qt中的界面展示与后台交互逻辑

交互逻辑三要素:data Model View 其中,data被添加到Model中,而Model则展示在View中。

而在本例中,ComboBox起到了一个View的作用,所以可以直接使用。如果是自定义一个列表来展示,比如示例代码中的事项列表,则需要专门的TaskListView.qmlTaskListViewForm.ui.qml文件。

具体实现步骤

  • 创建labels表
qml 复制代码
                tx.executeSql('CREATE TABLE IF NOT EXISTS labels(
                    label_id INTEGER PRIMARY KEY AUTOINCREMENT,
                    labelname TEXT
                )');
  • 编写数据库查询接口
qml 复制代码
    function getLabels() {
        let labels = []
        console.log("start read data from table labels")
        root._database().transaction(function(tx){
            let results =  tx.executeSql("SELECT labelname FROM labels")
            for (let i = 0; i < results.rows.length; i++) {
                let row = results.rows.item(i)
                labels.push({"text":row.labelname})
            }
        })
        return labels;
    }
  • 在ui.qml文件中新建一个ComboBox:
qml 复制代码
property alias labelSelectModel:labelSelect.model
...
        ComboBox {
            id: labelSelect
            editable: true
            model: ListModel {
                id: model
                ListElement { text: "工作" }
                ListElement { text: "生日" }
            }
        }
  • 添加数据至model中
qml 复制代码
    function createLabelLists() : void {
        var labels = Database.getLabels()
        labels.forEach(function(label){
            labelSelectModel.append(label);
        })
    }

参考文献

相关推荐
Larry_Yanan1 小时前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
一然明月4 小时前
Qt QML 锚定(Anchors)全解析
java·数据库·qt
一只爱学习的小鱼儿4 小时前
使用QT编写粒子显示热力图效果
开发语言·qt
大树学长4 小时前
【QT开发】Redis通信相关(一)
redis·qt
笨笨马甲4 小时前
Qt 人脸识别
开发语言·qt
山上三树5 小时前
Qt QObject介绍
开发语言·qt
山上三树5 小时前
QObject、QWidget、Widget三者的关系
qt
坚定学代码5 小时前
qt c++ 局域网聊天小工具
c++·qt·个人开发
笨笨马甲6 小时前
Qt network开发
开发语言·qt
mengzhi啊1 天前
Qt Designer UI 界面 拖的两个 QLineEdit,想按 Tab 从第一个跳到第二个
qt