QProcess报错:QXcbConnection: XCB error: 3 (BadWindow), sequence: 685, resource id: 25263003, major code: 40 (TranslateCoords), minor code: 0

问题背景

在使用QT的QProcess类来执行nmcli设置网络的命令时,执行成功,但是未生效。同样的命令在终端中运行时是正常的。

问题分析

这个错误信息 QXcbConnection: XCB error: 3 (BadWindow)QXcbConnection 有关,通常指的是与 X11 窗口系统的通信错误。虽然它可能不是直接与 nmcli 命令相关的原因,但它可能会影响 Qt 应用程序的执行环境。

在解决这个问题之前,我们可以确保 QProcess 执行 nmcli 命令的方式是正确的。下面是一个调整后的代码示例,包括检查命令执行的输出和错误信息:

#include <QProcess>
#include <QString>
#include <QStringList>
#include <QDebug>

bool Page2_network::modifyconn(const QString nic, const QString ipstring) {
    QProcess process;
    QStringList commands;

    // 构造修改网络接口的命令
    QString modifyCommand = QString("sudo nmcli connection modify %1 ipv4.addresses '%2' ipv4.method manual").arg(nic).arg(ipstring);
    qDebug() << modifyCommand;
    commands << modifyCommand;
    commands << "sudo nmcli connection down " + nic;
    commands << "sudo nmcli connection up " + nic;

    // 逐条执行命令
    for (const QString &command : commands) {
        process.start("bash", QStringList() << "-c" << command);
        if (!process.waitForFinished(-1)) { // 无限期等待
            qWarning() << "Command failed to finish: " << command;
            return false;
        }

        QString stdoutOutput = process.readAllStandardOutput();
        QString stderrOutput = process.readAllStandardError();
        qDebug() << "Command:" << command;
        qDebug() << "Standard Output:" << stdoutOutput;
        qDebug() << "Standard Error:" << stderrOutput;

        if (process.exitCode() != 0) {
            qWarning() << "Command failed with exit code" << process.exitCode() << ":" << command;
            return false;
        }
    }
    return true;
}

解决办法

关键点

  1. 使用 bash 执行命令:QProcess::start 中,使用 bash -c 来执行命令。这可以确保命令在一个完整的 shell 环境中执行。
  2. 检查命令输出和错误信息: 使用 process.readAllStandardOutput()process.readAllStandardError() 获取命令的输出和错误信息,并打印到调试日志中。
  3. 检查退出代码: 如果命令的退出代码不是 0,则记录错误并返回 false

关于 BadWindow 错误

这个错误通常与图形用户界面有关,并不一定直接影响 nmcli 命令的执行。如果这个错误是间歇性的并且不影响 nmcli 的执行,你可以暂时忽略它。但如果它频繁出现并导致程序不稳定,可以尝试以下方法:

  1. 更新 Qt 和相关库: 确保你使用的是最新版本的 Qt 和相关库,修复可能存在的 bug。
  2. 检查 X11 环境: 确保你的 X11 环境配置正确,特别是在使用远程桌面或虚拟机时。
  3. 最小化图形操作: 如果这个错误影响到了命令执行,可以尝试减少不必要的图形界面操作或延迟相关操作的执行。

通过这些方法,你应该能够确保 nmcli 命令正确执行,并避免由于图形界面问题导致的潜在干扰。

图片[1] - QProcess报错:QXcbConnection: XCB error: 3 (BadWindow), sequence: 685, resource id: 25263003, major code: 40 (TranslateCoords), minor code: 0 - 正则时光
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享