c++ - Qt5 : output of bash process has input statements too

标签 c++ bash qt

我创建了一个 bash 进程并将其连接到我的显示函数以通过我的 qTextEdit 编辑器显示输出

m_Shell = new QProcess(this);
m_Shell->setReadChannelMode(QProcess::MergedChannels);
connect (m_Shell, SIGNAL(readyReadStandardOutput()), this, SLOT(showOutput()));
m_Shell->start("bash", QStringList("-i"), QIODevice::ReadWrite);

我这样执行命令

QString cmdStr = "ls -l" + "\n";
QByteArray bytes = cmdStr.toUtf8();
m_Shell->write(bytes);

它执行得很好,我也得到了输出,我像这样附加到我的 qTextEdit

void showOutput()
{
    QByteArray strdata = bashProcess->readAllStandardOutput();
    qTextEditPtr->append(strdata);
}

但是 qTextEdit 的输出也有奇怪的输入字符,请看这张图

enter image description here

为什么这个 ls 和 ll commnads 也来了,而且换行也分开了,有时又在一起了

最佳答案

你的问题是,QTextEdit::append()附加一个段落,但您阅读的文本不是按段落拆分的,它可以在任何地方拆分。所以你不想在那里添加额外的段落分隔符!

解决方案是使用其他东西来插入文本,例如 get a copy of the text cursormove it to the end (因为用户可能移动了光标),然后 insert text使用光标:

void showOutput()
{
    QByteArray strdata = bashProcess->readAllStandardOutput();
    QTextCursor cursor = qTextEditPtr->textCursor(); // get copy of text cursor
    cursor.movePosition(QTextCursor::End); // make sure we're appending
    cursor.insertText(strdata); // add the text using implicit conversion to QString
}

注意:未经测试的代码,可能包含拼写错误等。使用隐式 QByteArrayQString 转换可能使用与终端使用的不同的文本编码,因此 7 位以外的字符ASCII 可能转换错误(在文本编辑中很容易看到有趣的字符)。

关于c++ - Qt5 : output of bash process has input statements too,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927545/

相关文章:

c++ - 如何创建文件路径可以像磁盘一样访问的虚拟文件系统

c++ - 从文件中读取并避免空行中的空格

bash - Grep 来自不同文件的多行,并将它们打印到 xml

bash - echo 删除反斜杠字符

linux - 阻止 Linux 应用程序中的所有键盘输入(使用 Qt 或 Mono)

visual-studio - 在 Visual Studio 2019 中安装 Qt

c++ - 可以为 FILE& 定义 operator<< 或 operator>> 吗?

c++ - 如何在 ARC 环境中为 C++ 指针指定属性?

arrays - grep输出到数组

c++ - 为什么共享库可以定位为一个用户,而不是另一个?