STTButton 同时承担功能键、图片按钮、开关元件和指示灯元件。它继承 STTWidget,可使用事件、确认、权限、蜂鸣、变量绑定、显隐和操作日志功能。
#include "widgets/STTButton.h"
using namespace stt;
STTButton* button = new STTButton(
getRuntime(),
parent,
"btnStart",
0
);
button->setMainArg(20, 20, 120, 48, true);
type:
| 值 | 用途 |
|---|---|
| 0 | 功能键,无状态图片要求 |
| 1 | 普通按钮元件 |
| 2 | 开关元件 |
| 3 | 指示灯元件 |
底层实际创建的是 lv_label,而不是 lv_btn,并给它增加可点击标志。不要把 object 强制转换为 lv_btn_t。
构造函数立即连接系统 Language 变量;该变量和 Runtime 必须已经存在。
button->setReleasedArg("启动", 0xffffff, "", 18, 0);
button->setReleasedStyle(
6, 255, 0x198754, 0x157347, 1,
1, 0x0f5132, 0, 0x000000, ""
);
button->setPressedArg("启动", 0xffffff, "", 18, 0);
button->setPressedStyle(
6, 255, 0x12633d, 0x12633d, 0,
1, 0x0f5132, 0, 0x000000, ""
);
图片路径仅在 FileUtil::fileExists 成功时设置。字体、图片和多语言标签应在页面显示前准备好。
setTransform 设置功能键按下时的尺寸变化:
button->setTransform(20, 20);
正值表示按宽/高的该分母缩小,例如 20 表示减少 1/20;负值会放大;0 表示该方向不变。type>0 的元件按钮不会应用变换。
STTButton* sw = new STTButton(getRuntime(), parent, "btnMode", 2);
sw->setMainArg(20, 80, 100, 60, true);
sw->setImg("0", "res/mode_off.png", "关闭");
sw->setImg("1", "res/mode_on.png", "开启");
sw->enStateLabel();
sw->setState("0");
API:
| 方法 | 说明 |
|---|---|
| setImg | 登记状态到图片和标题 |
| setTitle | 登记或修改状态标题 |
| getImg / getTitle | 按状态或条件匹配读取 |
| setState / getState | 设置或读取当前状态文本 |
| hasStateString | 判断是否有匹配状态 |
| getStateCount | 返回状态 map 项数 |
| switchNextState | 按 map 的键排序切换下一状态 |
| enStateLabel | 懒创建内部 STTLabel |
| getStateLabel | 获取内部标签,未启用时为 nullptr |
重要行为:
type=2 或 type=3 时,变量变化才会用于 setState:
Ivariable state = getRuntime()->getIVarMgr()->get("PumpState");
if (state != nullptr) {
sw->bindData(state);
}
onDataChanged 先刷新当前标题,再要求变量能 safeStoi。一般字符串即使已有同名状态也不会切换,因此开关/指示灯状态最好使用数字文本。
功能键和普通按钮的绑定变量不会触发状态切换。
button->bindOpenFormHandler(
LV_EVENT_CLICKED,
"FrmDetail",
PageMode::NEWWIN,
nullptr
);
button->bindCloseFormHandler(LV_EVENT_CLICKED, "Frm01");
嵌入模式可把 target 指向目标容器。处理器通过 map::insert 登记,同一 event 重复登记时后一次可能不会覆盖前一次。
页面 ID 必须存在;捕获的 IPageManager 与目标控件必须在按钮事件期间有效。