“QXcbConnection: XCB error:”报错来源是什么,如何修复该类报错?
报错原因
首先拆解报错字段含义:
- 错误类型
BadMatch(编码8)属于X11协议标准错误,代表X服务器收到的请求参数和目标资源的属性不匹配 - 主操作码
42对应SetInputFocus请求,说明错误是在设置窗口输入焦点时触发
该场景下的具体触发逻辑是:调用QTest.mouseClick(MyObject.push_button_ok, Qt.LeftButton)点击按钮后,关联的widget会立即执行销毁逻辑,但是Qt的事件循环还在处理点击事件的后续流程,会尝试给已经被销毁的widget/子控件设置输入焦点,此时对应的Xcb资源已经被释放,就会抛出该错误。
CI环境的Xvfb默认没有运行窗口管理器,缺少桌面环境下的焦点自动转移兜底逻辑,所以这类问题会比本地桌面环境更容易复现。这类错误通常不会影响测试用例的最终执行结果,仅会产生冗余日志干扰问题排查。
解决方案
可以根据测试场景选择以下任意一种方案修复:
- 调整事件执行顺序,在点击按钮后、widget销毁前主动消费完所有待处理事件:在mouseClick调用后增加一行
QCoreApplication.processEvents(),让Qt把所有待处理的X11事件全部处理完,再执行后续的widget销毁逻辑 - 修改按钮点击和窗口关闭的信号连接类型,将同步连接改为队列连接:将
push_button_ok的clicked信号和widget的close槽函数的连接方式指定为Qt::QueuedConnection,确保点击事件的全部后续处理流程执行完成后,再触发窗口销毁操作 - 补全Xvfb环境的窗口管理能力:CI启动Xvfb后,先运行
openbox、fluxbox这类轻量窗口管理器,补齐焦点自动管理逻辑,避免无WM环境下的焦点操作异常 - 若不需要保留xcb相关日志,可以配置Qt日志规则屏蔽该类报错:启动测试程序前设置环境变量
export QT_LOGGING_RULES="qt.xcb.*=false",直接关闭Qt的xcb模块日志输出
内容的提问来源于stack exchange,提问作者servoz
相关产品推荐
相关产品推荐

