STTSwitch 是双态开关控件,支持变量双向绑定、确认框、蜂鸣和操作日志。通用能力由 STTWidget 提供。
#include "widgets/STTSwitch.h"
using namespace stt;
STTSwitch* sw = new STTSwitch(getRuntime(), parent, "swPump");
sw->setMainArg(20, 20, 64, 32, false, true);
参数 ison 为初始状态,isbeep 控制用户操作蜂鸣。setMainArg 只在 ison=true 时添加 CHECKED 状态;重复调用时传 false 不会主动关闭旧状态,需显式 off。
sw->on();
sw->off();
sw->toggle();
bool enabled = sw->isOn();
on/off 通过 LV_STATE_CHECKED 控制状态。程序直接调用这些方法通常不会走用户 VALUE_CHANGED 确认和日志流程;若还需同步变量,应按业务显式写变量。
sw->setMainStyle(
9999, 0xcccccc, 0xbbbbbb, 2,
1, 0x999999, 0, 0x000000
);
sw->setIndicStyle(
9999, 0x16a05d, 0x55c98b, 2,
0, 0x000000, 0, 0x000000
);
sw->setKnobStyle(
9999, 0xffffff, 0xeeeeee, 1,
1, 0xaaaaaa, 1, 0x888888
);
| 方法 | 作用的 LVGL selector |
|---|---|
| setMainStyle | LV_PART_INDICATOR 的未选中状态 |
| setIndicStyle | LV_PART_INDICATOR 与 CHECKED 状态 |
| setKnobStyle | LV_PART_KNOB |
参数依次为圆角、主色、渐变色、渐变方向、边框宽/色、阴影宽/色。
Ivariable pump = getRuntime()->getIVarMgr()->get("PumpEnable");
if (pump != nullptr) {
sw->bindData(pump);
}
用户切换时,控件将 "0" 或 "1" 写回 bindVar。变量变化时:
如果变量可能产生多种布尔格式,应在数据层统一为 0/1。
sw->setConfirm(true, "确认切换水泵状态?");
sw->setOpLog(true);
sw->onEventHandler(LV_EVENT_VALUE_CHANGED, this,
(EHandler)&Frm01::onPumpChanged);
启用确认后,用户操作先显示确认框:
操作日志动作名为 "switch",信息记录旧/新值。日志由 OpLogMgr 异步落盘。
当前确认事件队列是 cpp 文件级全局 vector,不属于单个控件。多个开关同时打开确认流程可能互相清空或消费队列,应避免并发弹出多个开关确认框。
void Frm01::setupPumpSwitch(STTWidget* panel) {
STTSwitch* sw = new STTSwitch(getRuntime(), panel, "swPump");
sw->setMainArg(20, 20, 72, 36, false, true);
sw->setConfirm(true, "确认修改水泵启停状态?");
sw->setOpLog(true);
Ivariable value = getRuntime()->getIVarMgr()->get("PumpEnable");
if (value != nullptr) {
sw->bindData(value);
}
}