我创建了一个 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 的输出也有奇怪的输入字符,请看这张图
为什么这个 ls 和 ll commnads 也来了,而且换行也分开了,有时又在一起了
最佳答案
你的问题是,QTextEdit::append()附加一个段落,但您阅读的文本不是按段落拆分的,它可以在任何地方拆分。所以你不想在那里添加额外的段落分隔符!
解决方案是使用其他东西来插入文本,例如 get a copy of the text cursor和 move 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
}
注意:未经测试的代码,可能包含拼写错误等。使用隐式 QByteArray
到 QString
转换可能使用与终端使用的不同的文本编码,因此 7 位以外的字符ASCII 可能转换错误(在文本编辑中很容易看到有趣的字符)。
关于c++ - Qt5 : output of bash process has input statements too,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927545/