You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QJoysticks库使用时QList索引越界问题求助

修复QJoysticks中轴索引越界的ASSERT错误

这个问题的核心很明确:你的axes列表只初始化了3个元素(索引0、1、2),但系统触发轴事件时返回的e.axis是4,直接用axes[e.axis]访问自然会超出列表范围,触发Qt的索引越界断言。

要解决这个问题,你需要动态保证axes列表的大小足够容纳当前的轴索引,可以按以下两种方式修改代码:

方案1:在轴事件处理时动态扩展列表

直接在赋值前检查列表大小,若当前轴索引超出列表长度,就扩展列表到对应大小,同时初始化新元素为默认值(比如0):

void QJoysticks::onAxisEvent(const QJoystickAxisEvent& e) {
    if (!isBlacklisted(e.joystick->id)) {
        InputDevice* device = getInputDevice(e.joystick->id);
        // 检查轴索引是否超出列表范围,若超出则扩展列表
        if (e.axis >= device->axes.size()) {
            // 扩展到e.axis + 1个元素,新元素默认初始化为0
            device->axes.resize(e.axis + 1);
        }
        device->axes[e.axis] = e.value;
        emit axisChanged(e.joystick->id, e.axis, e.value);
    }
}

这种方式的好处是不需要提前知道设备的轴数量,完全动态适配,适合那些可能动态报告轴的设备。

方案2:在设备初始化时预先设置正确的轴数量

如果你的设备在连接时就能获取到准确的轴总数,那可以在设备初始化阶段就把axes列表的大小设置为轴的实际数量,这样后续就不会出现越界问题。比如在设备连接的处理逻辑中:

// 假设你有获取设备轴总数的方法,比如getAxisCount()
int axisCount = getDeviceAxisCount(e.joystick->id);
device->axes.resize(axisCount);
// 初始化所有轴为默认值
std::fill(device->axes.begin(), device->axes.end(), 0);

这种方式更高效,避免了每次事件都检查列表大小,但前提是你能在设备初始化时拿到准确的轴数量。

另外,建议你可以在调试时输出一下设备实际支持的轴总数,确认是否和你预期的3个轴一致——有时候系统识别的轴数量可能和物理轴数量有差异(比如有些设备会包含虚拟轴)。

内容的提问来源于stack exchange,提问作者Ilja Grebel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:34:12