菜单

STTSlider使用手册

下载

STTSlider.h 使用手册

STTSlider 是可交互滑块,支持普通、对称和范围模式,可与变量双向绑定,并继承 STTWidget 的确认框、蜂鸣、事件和操作日志功能。

1. 创建与初始化

cpp 复制代码
#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,严格要求时应在初始化后再设置一次范围和值。

2. 样式

cpp 复制代码
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 的生命周期要求。

3. 数值与模式

cpp 复制代码
slider->setRange(0, 100);
slider->setValue(70, false);

int value = slider->getValue();
int minv  = slider->getMinValue();
int maxv  = slider->getMaxValue();

动画使用:

cpp 复制代码
slider->getStyle()->p_anim->setTime(400);
slider->setValue(80, true);

绑定变量时不建议动画,因为动画过程中会连续产生值变化并可能反复回写变量。

模式含义:

mode 说明
0 普通滑块
1 对称模式,建议范围跨越 0
2 范围模式,indicator 从 left value 到主值

重要实现问题:

cpp 复制代码
slider->setMode(2); // 可用
slider->setLeftValue(20, false);

// 不要这样写:
// slider->setMode(2)->setLeftValue(...);

setMode 虽声明返回 STTSlider*,当前实现设置模式后返回 nullptr。它不能参与链式调用。

其余读取接口:

cpp 复制代码
int left = slider->getLeftValue();
int mode = slider->getMode();
bool dragging = slider->isDragged();

getLeftValue 主要用于 mode=2。

4. 值变化触发时机

cpp 复制代码
void setValueChangeMode(int8_t mode = 0);

这是隐藏接口,但为完整性说明:

mode 回写和回调时机
0 或其他 LV_EVENT_VALUE_CHANGED,拖动过程中持续触发
1 LV_EVENT_RELEASED,松手时触发
cpp 复制代码
slider->setValueChangeMode(1);

它会移除并重新注册内部回调。对于写 PLC、数据库或网络的高成本变量,松手回写更合适。

5. 变量绑定与动态上下限

cpp 复制代码
Ivariable speed = getRuntime()->getIVarMgr()->get("SpeedSet");
if (speed != nullptr) {
    slider->bindData(speed);
}
slider->setVariableLimit("SpeedLow", "SpeedHigh");

用户操作时值写入 bindVar;外部变量变化时 onDataChanged 更新滑块并同步内部 lastValue,以防确认取消恢复到错误值。

setVariableLimit 会连接两个整数变量。当前没有空指针检查,名称不存在可能崩溃。空字符串不解除旧连接。

6. 确认框、日志与事件

cpp 复制代码
slider->setConfirm(true, "确认修改速度?");
slider->setOpLog(true);
slider->onEventHandler(
    LV_EVENT_VALUE_CHANGED,
    this,
    (EHandler)&Frm01::onSpeedChanged
);

确认取消时恢复内部 lastValue;确认后写变量、写日志再执行回调。范围模式中左右 knob 的值变化共享同一处理流程,业务回调需要根据 getValue/getLeftValue 读取实际状态。

7. 完整示例

cpp 复制代码
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);
}

8. 注意事项

  • setMode 当前返回 nullptr,禁止链式调用。
  • setRange 应保证 min < max。
  • 动态上下限变量必须存在并可转整数。
  • 高频双向绑定时关闭动画,并考虑 setValueChangeMode(1)。
  • 确认对话框打开期间后续值变化会被忽略。
  • img 的类型和生命周期必须符合 LVGL 图片源要求。
  • onConfirm、onDataChanged 和上下限回调由框架调用。
最近修改: 2026-10-21Powered by