You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Q_PROPERTY中使用QVector,实现weekKm/weekTime自动更新及QML便捷访问

问题解决:修改m_weekKmAndTime后自动更新weekKm/weekTime并支持QML直接调用

问题背景

修改m_weekKmAndTime中的值后,weekKm和weekTime无法自动同步更新到QML界面;希望能直接通过DbModel.weekKm(0)这类方式获取最新值,无需在QML中额外维护变量。

核心问题

原代码中发射的weekKmChanged()和weekTimeChanged()是无参信号,QML无法识别具体哪一天的数值发生了变化;且weekKm/weekTime仅标记为Q_INVOKABLE,缺少配套的带参通知机制,导致QML无法感知特定日期的数值更新。

解决方案

1. 调整头文件,添加带参通知信号

在.h中,为weekKm和weekTime补充带参数的变化信号,保留Q_INVOKABLE标记以支持QML直接调用:

Q_PROPERTY(QVector<QPair<int, int>> weekKmAndTime READ weekKmAndTime NOTIFY weekKmAndTimeChanged)

Q_INVOKABLE int weekKm(int day) const;
Q_INVOKABLE int weekTime(int day) const;

signals:
    void weekKmAndTimeChanged();
    void weekKmChanged(int day);  // 新增带参信号,标记具体哪一天的km变化
    void weekTimeChanged(int day); // 新增带参信号,标记具体哪一天的time变化

2. 修改cpp文件,发射对应日期的信号

在setWeek函数中,先获取被修改的目标日期索引,再发射对应信号:

void DataBaseModel::setWeek(QString day, int new_km, int new_time) {
    int targetDay = returnNumberFromDay(day); // 拿到要修改的日期索引
    m_weekKmAndTime[targetDay] = qMakePair(new_km, new_time);
    qDebug() << new_km << " " << new_time;

    emit weekKmAndTimeChanged();
    emit weekKmChanged(targetDay); // 发射对应日期的km变化信号
    emit weekTimeChanged(targetDay); // 发射对应日期的time变化信号
}

3. QML中实现自动更新

在QML里,通过Connections组件监听带参信号,当指定日期的数值变化时,触发界面刷新。例如显示第0天的km数值:

Text {
    id: day0KmText
    text: DbModel.weekKm(0).toString()

    Connections {
        target: DbModel
        function onWeekKmChanged(day) {
            if (day === 0) {
                day0KmText.text = DbModel.weekKm(0).toString();
            }
        }
    }
}

如果需要批量处理多天数据,可结合Repeater组件封装复用逻辑,减少冗余代码。


内容的提问来源于stack exchange,提问作者percipi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:25:02