Qt 4.8.6中的QTextBrowser显示问题 - 始终显示错误

时间:2017-12-20 04:06:01

标签: qt qt4 qtextbrowser

我希望读取一些字符或字符串,并通过Qt 4.8.6从串口显示QTextBrowse并调用以下函数(textBrowser是QTextBrowser的对象):

connect(com, SIGNAL(readyRead()), this, SLOT(readSerialPort()));
connect(textBrowser, SIGNAL(textChanged()), SimApplianceQtClass, SLOT(on_textBrowser_textChanged()));

void SimApplianceQt::on_textBrower_textChanged()
{
    ui.textBrowser->moveCursor(QTextCursor::End); 
}

void SimApplianceQt::readSerialPort()
{
    QByteArray temp = com->readAll();
    ui.textBrowser->insertPlainText(temp);
}

但是,每次我都无法正确显示textBrowser中的字符或字符串。这些输入字符串总是被切割成较小的字符串,以便在textBrowser中以多行显示。例如,一个字符串" 0123456789"可以显示为(多行):

01
2345
6789

如何处理这个问题?非常感谢。

1 个答案:

答案 0 :(得分:0)

发生的readyRead信号是触发,而不是在收到所有之后,但是接收并准备好阅读之后。

当您收到第一个readyRead时,无法保证所有内容都已到达或可读 对于几乎任何类型的IO来说,这是一个常见的“问题”,特别是如果数据大于非常少的字节。通常没有自动方式知道何时收到所有数据。

有一些可能的解决方案
所有这些都需要您将数据放在readSerialPort()中的缓冲区中,而不是直接将其添加到文本浏览器中。也许SimApplianceQt中的一个简单的QByteArray成员变量已经可以解决你的问题。

其余的取决于确切的解决方案。

  1. 如果您有权访问数据的发件人,您可以发送 发送实际字符串之前将发送的字节数。 这必须始终是相同大小的整数类型(for 例如,总是一个quint32)。然后,在readSerialPort()中,你会 首先读取该大小,然后继续读取缓冲区中的字节 在readSerialPort()中,直到收到所有内容。然后, 你终于可以打印出来了。我推荐一个。它也是几乎所有出现此问题的情况下使用的内容。
  2. 如果您有权访问数据的发件人,您可以发送一些 字符串末尾的“结束序列”。在你的 readSerialPort(),然后你会继续读取你的字节 缓冲,直到你收到结束序列。一旦结束 已收到序列,您可以打印所有内容 之前。请注意,结束序列本身可能会被中断, 所以你也必须照顾它。
  3. 如果您无法访问发件人,我最好的想法就是来 将与计时器一起工作。你把所有东西放进去了 缓冲区并在每次readSerialPort()时重新启动该计时器 调用。当计时器用完时,这意味着没有新的数据 发送一段时间,你可以打印到目前为止你所拥有的。 这是......有风险的,如果有其他办法,我不会推荐它。