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

如何在Sailfish OS的QML中循环添加元素并接入Python返回列表?

在Sailfish OS QML中使用Python返回的列表生成菜单

核心逻辑

Sailfish OS基于Qt/QML生态,Python端需通过PySide2/PyQt将列表数据暴露给QML上下文,再借助QML的Repeater组件动态生成MenuItem,替代静态编写的菜单选项。

步骤1:Python端暴露列表数据

假设你已有返回菜单列表的Python函数,通过上下文属性将数据注入QML:

from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine

def get_python_menu_items():
    # 替换为你的业务逻辑,返回包含text字段的字典列表
    return [{"text": f"Python 选项 {i}"} for i in range(5)]

if __name__ == "__main__":
    app = QGuiApplication([])
    engine = QQmlApplicationEngine()
    
    # 将Python列表注入QML上下文,命名为pythonMenuItems
    engine.rootContext().setContextProperty("pythonMenuItems", get_python_menu_items())
    
    engine.load("main.qml")
    app.exec_()

步骤2:QML端动态生成菜单

修改你的QML代码,用Repeater遍历Python传来的列表,自动创建菜单选项:

import QtQuick 2.0
import Sailfish.Silica 1.0

Page {
    menu: ContextMenu {
        id: cntmenu
        
        // 用Repeater绑定Python传入的列表,动态生成MenuItem
        Repeater {
            model: pythonMenuItems
            MenuItem {
                text: model.text
                onClicked: console.log("选中:", text)
            }
        }
    }

    Label {
        text: "长按/右键调出菜单"
        anchors.centerIn: parent
    }
}

额外提示

  • 若列表数据需要动态更新,建议将其封装为QAbstractListModel子类,这样数据变化时QML会自动刷新菜单,而非使用简单的静态列表。
  • 确保Python返回的列表元素字段与QML中引用的字段一致(示例中均为text)。
  • Sailfish OS的ContextMenu默认通过长按或右键触发,无需给菜单本身绑定onClicked,只需为单个MenuItem绑定点击逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:15:59