【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);
        })
    }

参考文献

相关推荐
追风赶月、9 小时前
【QT】事件(鼠标、按键、定时器、窗口)
qt
牵牛老人12 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
-凌凌漆-16 小时前
【Qt】QStringLiteral 介绍
开发语言·qt
想要入门的程序猿16 小时前
Qt写入excel
数据库·qt·excel
丁劲犇18 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
charlie11451419118 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
醇醛酸醚酮酯20 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
Mr_Xuhhh21 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
灵性花火1 天前
Qt的前端和后端过于耦合(0/7)
开发语言·前端·qt
菜鸟看点1 天前
自定义Cereal XML输出容器节点
c++·qt