STTQRCode 封装 LVGL 二维码对象,可显示文本或任意字节序列。虽然头文件包含 STTCanvas.h,但类本身继承 STTWidget。
构造函数只初始化类型和内部指针,并不创建底层二维码 object。必须先调用一次 setMainArg:
#include "widgets/STTQRCode.h"
using namespace stt;
STTQRCode* qr = new STTQRCode(getRuntime(), parent, "qrOrder");
qr->setMainArg(
20, 20, 180, 180,
0xffffff,
0x000000,
"ORDER:20261020-001"
);
在 setMainArg 之前调用 update、setSize 或析构一个未完成初始化的对象,都可能访问空 object。创建后应立即完成 setMainArg。
void setMainArg(
int x = 0, int y = 0, int w = 100, int h = 100,
int background = 0xffffff,
int foreground = 0x000000,
const char* data = "www.simtutai.com"
);
第一次调用时:
后续再次调用 setMainArg 只执行 setSize(w, h),不会更新位置、颜色或 data。这是当前实现的重要差异,不应把第二次调用当作完整重新配置。
字符串重载:
uint8_t rc = qr->update("https://example.com/order/001");
字节重载:
const char payload[] = {'A', 'B', '\0', 'C'};
uint8_t rc = qr->update(payload, sizeof(payload));
签名:
uint8_t update(const void* data, int data_len);
uint8_t update(const string& data);
返回值直接来自 lv_qrcode_update。头文件写“1 成功、0 失败”,但 LVGL 版本的 lv_res_t 枚举语义可能相反或不同,应以本工程所用 LVGL 定义为准,不要硬编码 rc==1。至少可在真机上用已知短文本验证。
void* 重载还会把 data 当 C 字符串保存到内部 string,因此即便 data_len 支持二进制,中间零字节后的缓存内容会截断;控件改变尺寸后重绘只会使用截断后的缓存。需要二进制二维码时,尺寸变更后应再次传完整数据。
qr->setSize(220, 220);
setSize 会重新分配 1 bit canvas 缓冲区并用缓存内容重绘。二维码通常应保持正方形。
当前实现:
qr->setWidth(200); // 空操作
qr->setHeight(200); // 空操作
setWidth 和 setHeight 的底层调用已被注释,虽然返回 this,但不会改变尺寸。必须使用 setSize。
缓冲区 realloc 没有显式检查失败;避免频繁以大尺寸反复缩放。
Ivariable code = getRuntime()->getIVarMgr()->get("OrderQRCode");
if (code != nullptr) {
qr->bindData(code);
}
onDataChanged 直接用 data->toStr() 更新二维码。变量文本过长可能因当前尺寸和二维码容量不足而更新失败。
STTQRCode* qr = new STTQRCode(getRuntime(), panel, "qrTrace");
qr->setMainArg(32, 32, 200, 200, 0xffffff, 0x111111, "INIT");
string trace = "TRACE|SN=ABCD1234|DATE=20261020";
uint8_t status = qr->update(trace);
// 需要调整时使用 setSize,不使用 setWidth/setHeight
qr->setSize(240, 240);