首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5 : bash流程的输出也有输入语句

Qt5 : bash流程的输出也有输入语句
EN

Stack Overflow用户
提问于 2016-08-12 23:04:25
回答 2查看 121关注 0票数 1

我创建一个bash进程,并将它连接到我的显示函数,以便在我的qTextEdit编辑器上显示输出。

代码语言:javascript
复制
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);

我这样执行我的命令

代码语言:javascript
复制
QString cmdStr = "ls -l" + "\n";
QByteArray bytes = cmdStr.toUtf8();
m_Shell->write(bytes);

它执行得很好,我也得到了输出,我将其附加到qTextEdit中,如下所示

代码语言:javascript
复制
void showOutput()
{
    QByteArray strdata = bashProcess->readAllStandardOutput();
    qTextEditPtr->append(strdata);
}

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

为什么这个ls和ll commnads也会来,而那个新行也会分开,有时还会在一起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-15 19:32:46

你的问题是,QTextEdit::append()附加了一个段落,但是你读到的文本不是按段落分开的,它可以在任何地方分割。所以你不想在那里增加额外的段落中断!

解决方案是使用其他方法插入文本,例如获取文本光标的副本把它移到最后 (因为用户可能移动了游标),然后使用游标进行插入文本

代码语言:javascript
复制
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以外的字符可能会被转换错(在文本编辑中很容易被视为有趣的字符)。

票数 1
EN

Stack Overflow用户

发布于 2016-08-12 23:11:29

这一点也不奇怪。交互式shell接受输入,并在控制台上重复它。这样你就能读到你输入的内容。

与其运行交互式shell,不如通过-c命令行选项将命令传递给shell,详见bash的手册。假装与shell交互的会话是交互式的,这通常不是一个好主意。

如果您确实希望模拟交互式终端,则应该使用适当的小部件,例如QTermWidget

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38927545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档