Chapter 189 · XUI 游戏与交互控件

QRCode 二维码

二维码生成控件:自动版本选择、前景/背景色、中心 Logo 嵌入。

189

概念

QRCode 控件生成并显示二维码:
• Value:编码内容(URL/文本/JSON)
• 自动版本:根据数据长度自动选择 QR 版本(1-40)
• 颜色:前景色(模块)+ 背景色
• Logo:中心嵌入图标(Surface + 尺寸)
• Padding:二维码周围留白

API 速查

函数说明
int xuiQrCodeCreate(pCtx, ppW, pDesc)创建二维码
int xuiQrCodeSetValue(pW, sValue)设置内容
const char* xuiQrCodeGetValue(pW)获取内容
int xuiQrCodeSetColors(pW, iFg, iBg)前景/背景色
int xuiQrCodeSetPadding(pW, fPadding)留白
int xuiQrCodeSetIcon(pW, pSurface, tSrc, fSize)中心 Logo
xui_surface xuiQrCodeGetIcon(pW)获取 Logo
float xuiQrCodeGetIconSize(pW)Logo 尺寸

编译本章示例

gcc -O2 -I. -o ch189.exe ch189_main.c src\xui_*.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch189.exe

示例:带 Logo 的二维码

xui_qrcode_desc_t desc = { 0 };

xui_widget pQR;
xuiQrCodeCreate(pCtx, &pQR, &desc);

// 编码 URL
xuiQrCodeSetValue(pQR, "https://xge.dev/download");

// 深色前景 + 白色背景
xuiQrCodeSetColors(pQR, 0x1A1A2EFF, 0xFFFFFFFF);

// 留白 8px
xuiQrCodeSetPadding(pQR, 8.0f);

// 中心 Logo(占 QR 宽度 20%)
xui_rect_t tSrc = { 0, 0, 64, 64 };
xuiQrCodeSetIcon(pQR, pLogoSurface, tSrc, 0.2f);

xuiWidgetAddChild(pPanel, pQR);

完整代码

将以下代码保存为 ch189_main.c,编译后运行即可看到二维码生成效果:

#include "xge.h"
#include "xui.h"

static xui_context g_pCtx;

static int onFrame(void* pUser) {
    (void)pUser;
    xgeClear(0xFFFFFFFF);
    xui_vec2_t pos;
    xgeMouseGet(&pos.x, &pos.y);
    xuiInputPointerMove(g_pCtx, pos.x, pos.y);
    if (xgeMouseDown(XGE_MOUSE_LEFT))
        xuiInputPointerDown(g_pCtx, pos.x, pos.y, 0);
    else
        xuiInputPointerUp(g_pCtx, pos.x, pos.y, 0);
    xuiUpdate(g_pCtx, xgeGetDelta());
    xuiLayout(g_pCtx);
    xuiRender(g_pCtx, NULL, NULL, 0);
    return XGE_OK;
}

int main(void) {
    xge_desc_t d = { 0 };
    d.iWidth = 400; d.iHeight = 400;
    d.sTitle = "ch189 - QRCode";
    d.iFlags = XGE_INIT_VSYNC;
    xgeInit(&d);

    xuiCreate(&g_pCtx);
    extern const xui_proxy_t tXgeProxy;
    xui_proxy_t tXgeProxy = xuiProxyXge();
xuiSetProxy(g_pCtx, &tXgeProxy);
    xuiSetViewportSize(g_pCtx, 400, 400);

    xui_qrcode_desc_t qdesc = { 0 };
    xui_widget pQR;
    xuiQrCodeCreate(g_pCtx, &pQR, &qdesc);

    // 编码 URL
    xuiQrCodeSetValue(pQR, "https://xge.dev/download");

    // 深色前景 + 白色背景
    xuiQrCodeSetColors(pQR, 0x1A1A2EFF, 0xFFFFFFFF);

    // 留白 8px
    xuiQrCodeSetPadding(pQR, 8.0f);

    xui_widget pRoot = xuiGetRootWidget(g_pCtx);
    xuiWidgetAddChild(pRoot, pQR);
    xuiWidgetSetRect(pQR, (xui_rect_t){0, 0, 300, 300});
    /* 位置已含于上方 SetRect */

    xgeRun(onFrame, NULL);
    xuiDestroy(g_pCtx);
    xgeUnit();
    return 0;
}

代码讲解

  • QrCodeCreate:创建二维码控件。
  • SetValue:设置编码内容(URL/文本/WiFi 等),自动重新生成矩阵。
  • SetColors:前景色 + 背景色,建议高对比度确保可扫描。
  • SetIcon:可选中心 Logo,不超过宽度 30%。

要点与陷阱

  • Logo 尺寸:不超过 QR 宽度 30%,否则影响扫描识别率。
  • 纠错等级:嵌入 Logo 时建议使用 H 级纠错(desc 配置)。
  • 动态更新:SetValue 后自动重新生成二维码矩阵。
  • 尺寸:控件大小决定渲染像素,建议正方形且 ≥ 200px。

进阶练习

  1. 分享功能:Input 输入文本 → 实时生成二维码。
  2. 批量生成:ListView 展示多条二维码(WiFi/名片等)。
QRCode 二维码效果
图:QRCode 二维码渲染效果