STTDropdown 是带键值数据源的下拉框。每项通常包含 id 和 name:界面显示 name,业务值使用 id。它支持内置 JSON 表、外部 TTable/TTableView/TRecipe 和普通变量双向绑定。
#include "widgets/STTDropdown.h"
using namespace stt;
STTDropdown* dropdown =
new STTDropdown(getRuntime(), parent, "ddMode");
dropdown->setMainArg(
20, 20, 180, 40,
R"([{"id":"auto","name":"自动"},{"id":"manual","name":"手动"}])",
0,
ScrollDir::BOTTOM,
nullptr,
180,
true
);
h_list>0 时限制弹出列表高度。dir 常用 LEFT=1、RIGHT=2、TOP=4、BOTTOM=8。
dropdown->setOptions(
R"([{"id":"1","name":"低速"},{"id":"2","name":"高速"}])",
0
);
dropdown->addOption("3", "检修");
setOptions 会重建内部 TTable,随后 setSelected(selectedIndex, false)。selectedIndex 是行序号,不是 id。
addOption 只对正在使用内部表时有效,允许重复 id。字符串由 JSON 解析,输入应是可信 JSON。
int rows = dropdown->getOptionCount();
int shown = dropdown->getOptionCnt();
dropdown->clearOptions();
TTable* data = dropdown->getData();
使用内部表时返回内部拥有的 TTable;绑定表变量时返回 bindVar 强转的表。都是借用指针,调用方不得 delete。
dropdown->setSelected(1, true);
int index = dropdown->getSelectedIndex();
string text = dropdown->getSelectedText();
string value = dropdown->getSelectedValue();
notify=true 会:
越界 index 被静默忽略。getSelectedText 使用固定 64 字节缓冲区,较长文本可能被截断。getSelectedValue 取数据源第 0 列。
绑定表:
dropdown->bindData(tableVariable);
表类型会用其 label 列构造显示项,并同步 selectedIndex。表没有已选项且有数据时,当前实现自动选择第 0 行并回写表。
绑定普通变量:
dropdown->setOptions(options, 0);
dropdown->bindData(getRuntime()->getIVarMgr()->get("ModeId"));
普通变量的文本会与数据源第 0 列 id 比较;命中时切换显示。用户选中后把 id 写回变量。
dropdown->setMainStyle(
6, 0xffffff, 0xf5f5f5, 1,
1, 0xcccccc, 0, 0x000000
);
dropdown->setListSelectedStyle(
4, 0x1687d9, 0x1687d9, 0,
0, 0x000000
);
dropdown->setFonts(
0x222222, 16, "", false,
0xffffff, 16, "", 0, 0
);
getListStyle 返回弹出列表的 STTStyle,可做进一步设置。该样式绑定到底层 list object,控件销毁或 LVGL 重建后不可继续使用。
dropdown->setDir(ScrollDir::BOTTOM);
dropdown->setSymbol(ICON::get(ICON::DOWN), true);
dropdown->setSelectedHightlight(true);
dropdown->expand();
dropdown->collapse();
getDir、getSymbol、getSelectedHightlight 可读取底层状态。
setSymbol:
通过 STTWidget::setConfirm 开启后,取消会恢复 lastSelectedIndex,确认会重新构造 VALUE_CHANGED 事件并完成写变量/回调。onConfirm 为框架内部入口。