STTRoller 是滚轮选择器,使用 id/name 键值表保存选项。它支持内部 JSON、表变量和普通变量双向绑定。
#include "widgets/STTRoller.h"
using namespace stt;
STTRoller* roller = new STTRoller(getRuntime(), parent, "rollerHour");
roller->setMainArg(
20, 20, 100, 180,
0,
R"([{"id":"0","name":"00"},{"id":"1","name":"01"}])",
0,
true
);
实现差异:setMainArg 的 mode 参数当前没有使用;setOptions 和表更新都使用 LV_ROLLER_MODE_NORMAL。因此传 mode=1 也不会启用循环模式。
roller->setMainStyle(6, 0xffffff, 0xf5f5f5, 1,
255, 1, 0xcccccc, 0, 0);
roller->setSelectedStyle(0, 0x1687d9, 0x1687d9, 0, 255);
roller->setFontStyle(0x333333, 16, "",
0xffffff, 18, "", 0, 1);
roller->setVisibleRowCount(5);
当前 setFontStyle 只有在 fontname1/fontname2 非空时才同时设置该部分的字体和颜色。传空字体名不会应用 c1/c2,这是与默认参数直觉不同的地方;若要改颜色,应给出有效字体名。
roller->setOptions(options, 0);
roller->setSelected(1, true);
int count = roller->getOptionCnt();
int index = roller->getSelectedIndex();
string text = roller->getSelectedText();
string value = roller->getSelectedValue();
TTable* data = roller->getData();
selectedIndex 是行序号。getSelectedText 从数据源第 1 列取 name,getSelectedValue 从第 0 列取 id。getData 为借用指针。
setSelected 总是以动画方式滚动,即使 notify=false。notify=true 时同步内部表/绑定表 selectedIndex,或把 id 写回普通变量,再发 VALUE_CHANGED。
越界 index 会静默忽略。
表变量:
roller->bindData(tableVariable);
显示内容来自表的 label 列,选项之间用换行传给 LVGL;表 selectedIndex 会同步到滚轮。
普通变量:
roller->setOptions(options, 0);
roller->bindData(getRuntime()->getIVarMgr()->get("HourId"));
普通变量值按第 0 列匹配,命中时切换选中项。
当前 onDataChanged 的类型条件中,第三项检查的是 widgetInfo->bindVar->type(),而不是 data->type(),且未先检查 bindVar 是否为空。框架正常绑定路径通常有值,但业务不应直接以空绑定调用 onDataChanged。
开启 setConfirm 后,取消恢复 lastSelectedIndex,确认将当前 LVGL 序号写回并触发回调。onConfirm 是内部方法。
STTRoller* speed = new STTRoller(getRuntime(), panel, "rollerSpeed");
speed->setMainArg(
20, 20, 120, 180, 0,
R"([{"id":"500","name":"500 rpm"},
{"id":"1000","name":"1000 rpm"},
{"id":"1500","name":"1500 rpm"}])",
1,
true
);
speed->setVisibleRowCount(3);
speed->setConfirm(true, "确认修改速度?");
Ivariable value = getRuntime()->getIVarMgr()->get("SpeedSet");
if (value != nullptr) speed->bindData(value);