STTSlider 是可交互滑块,支持普通、对称和范围模式,可与变量双向绑定,并继承 STTWidget 的确认框、蜂鸣、事件和操作日志功能。
#include "widgets/STTSlider.h"
using namespace stt;
STTSlider* slider = new STTSlider(getRuntime(), parent, "sliderSpeed");
slider->setMainArg(20, 20, 280, 40, 50, 0, 100, true);
setMainArg 设置位置、尺寸、初值、范围和蜂鸣。当前实现先 setValue 再 setRange,严格要求时应在初始化后再设置一次范围和值。
slider->setMainStyle(
9999, 0xdddddd, 0xdddddd, 0,
0, 0xdddddd, 0, 0x000000, nullptr
);
slider->setIndicStyle(
9999, 0x18a765, 0x18a765, 0,
0, 0xdddddd, 0, 0x000000, nullptr
);
slider->setKnobStyle(
9999, 0xffffff, 0xeeeeee, 1,
1, 0x18a765, 2, 0x888888, nullptr, 4
);
三组样式分别作用于主轨道、indicator 和 knob。img 是 LVGL 可识别的图片源指针,不是 string 文件名;传入图片后对应背景透明。图片描述符或路径内存必须满足 LVGL 的生命周期要求。
slider->setRange(0, 100);
slider->setValue(70, false);
int value = slider->getValue();
int minv = slider->getMinValue();
int maxv = slider->getMaxValue();
动画使用:
slider->getStyle()->p_anim->setTime(400);
slider->setValue(80, true);
绑定变量时不建议动画,因为动画过程中会连续产生值变化并可能反复回写变量。
模式含义:
| mode | 说明 |
|---|---|
| 0 | 普通滑块 |
| 1 | 对称模式,建议范围跨越 0 |
| 2 | 范围模式,indicator 从 left value 到主值 |
重要实现问题:
slider->setMode(2); // 可用
slider->setLeftValue(20, false);
// 不要这样写:
// slider->setMode(2)->setLeftValue(...);
setMode 虽声明返回 STTSlider*,当前实现设置模式后返回 nullptr。它不能参与链式调用。
其余读取接口:
int left = slider->getLeftValue();
int mode = slider->getMode();
bool dragging = slider->isDragged();
getLeftValue 主要用于 mode=2。
void setValueChangeMode(int8_t mode = 0);
这是隐藏接口,但为完整性说明:
| mode | 回写和回调时机 |
|---|---|
| 0 或其他 | LV_EVENT_VALUE_CHANGED,拖动过程中持续触发 |
| 1 | LV_EVENT_RELEASED,松手时触发 |
slider->setValueChangeMode(1);
它会移除并重新注册内部回调。对于写 PLC、数据库或网络的高成本变量,松手回写更合适。
Ivariable speed = getRuntime()->getIVarMgr()->get("SpeedSet");
if (speed != nullptr) {
slider->bindData(speed);
}
slider->setVariableLimit("SpeedLow", "SpeedHigh");
用户操作时值写入 bindVar;外部变量变化时 onDataChanged 更新滑块并同步内部 lastValue,以防确认取消恢复到错误值。
setVariableLimit 会连接两个整数变量。当前没有空指针检查,名称不存在可能崩溃。空字符串不解除旧连接。
slider->setConfirm(true, "确认修改速度?");
slider->setOpLog(true);
slider->onEventHandler(
LV_EVENT_VALUE_CHANGED,
this,
(EHandler)&Frm01::onSpeedChanged
);
确认取消时恢复内部 lastValue;确认后写变量、写日志再执行回调。范围模式中左右 knob 的值变化共享同一处理流程,业务回调需要根据 getValue/getLeftValue 读取实际状态。
STTSlider* speed = new STTSlider(getRuntime(), panel, "speed");
speed->setMainArg(20, 40, 300, 36, 0, 0, 1500, true);
speed->setValueChangeMode(1);
speed->setConfirm(true, "确认修改转速设定?");
speed->setOpLog(true);
Ivariable value = getRuntime()->getIVarMgr()->get("Motor.SpeedSet");
if (value != nullptr) {
speed->bindData(value);
}