我创建一个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也会来,而那个新行也会分开,有时还会在一起。
发布于 2016-08-15 19:32:46
你的问题是,QTextEdit::append()附加了一个段落,但是你读到的文本不是按段落分开的,它可以在任何地方分割。所以你不想在那里增加额外的段落中断!
解决方案是使用其他方法插入文本,例如获取文本光标的副本和把它移到最后 (因为用户可能移动了游标),然后使用游标进行插入文本:
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以外的字符可能会被转换错(在文本编辑中很容易被视为有趣的字符)。
发布于 2016-08-12 23:11:29
这一点也不奇怪。交互式shell接受输入,并在控制台上重复它。这样你就能读到你输入的内容。
与其运行交互式shell,不如通过-c命令行选项将命令传递给shell,详见bash的手册。假装与shell交互的会话是交互式的,这通常不是一个好主意。
如果您确实希望模拟交互式终端,则应该使用适当的小部件,例如QTermWidget。
https://stackoverflow.com/questions/38927545
复制相似问题