在Qt编程中将数据库的数据在UI上展示

上一篇说到怎么用JS连接数据库,这篇说一下拿到数据后怎么展示到UI上。

Qt的Model框架是Model-View架构的核心部分,用于管理和表示数据。它提供了一种标准化的方式来将数据与用户界面分离,使得数据可以以多种形式展示。

在这个架构下,Model负责管理数据,View负责展示数据,Delegate负责数据显示和编插的细节,简单来说,我们需要一个View来展示数据,View里面指定一个Model指定数据的来源,每一项数据通过Delegate展示出来,相当于列表中的每一行。

下面的例子通过JS读取数据库,使用SilicaListView作为View,ListModel作为Model,ListItem作为Delegate,展示如何将数据库的数据展示到视图上。

先在JS文件中定义读取数据库的函数。

.import QtQuick.LocalStorage 2.0 as SQL

function getDatabase() {
    return SQL.LocalStorage.openDatabaseSync("days", "1.0", "daysinfo", 25000);
}

function getDays(status) {
    var sql = 'SELECT * FROM day;';
    if( status === "favorite" ) {
        sql = 'SELECT * FROM day WHERE favorite = 1;';
    }

    var db = getDatabase()
    listModel.clear()//listModel是QML中ListModel的id
    db.transaction(function(tx) {
        var rs = tx.executeSql(sql);
        if ( rs.rows.length > 0 ) {
            for ( var i = 0; i < rs.rows.length; i++){
                listModel.append({
                                     "dayid": rs.rows.item(i).dayid,
                                     "name": rs.rows.item(i).name,
                                     "year": rs.rows.item(i).year,
                                     "month": rs.rows.item(i).month,
                                     "day": rs.rows.item(i).day,
                                     "datetext": rs.rows.item(i).datetext,
                                     "favorite": rs.rows.item(i).favorite
                                 }
                                     )
            }
        }
    })
}

然后在QML文件创建一个SilicaListView,里面创建ListModel和ListItem,以展示数据库中name字段为例。

SilicaListView {
    id: listview
    ListModel {
        id: listModel
    }
    model: listModel
    delegate: ListItem {
        id: listItem
        Label {
            id: nametext
            text: name
    }
}

这个时候我们就创建好View、Model和Delegate了,下一步就是将数据填充到Delegate上。Qt Quick的组件提供了一个onCompleted信号,当组件完成初始化的时候会发射,我们就利用这个信号槽,在组件完成初始化的时候加载数据。

SilicaListView {
    id: listview
    ......
    Component.onCompleted: {
        ST.getDays("all")
    }
    ......
}

完成这一步,就成功将数据展示到视图上了。

posted @ 2025-05-06 22:52  fishegg  阅读(61)  评论(0)    收藏  举报