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

问题描述 投票:0回答:1

我希望读取一些字符或字符串,并通过Qt 4.8.6从串口显示QTextBrowser并调用以下函数(文本Browser是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

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

qt qt4 qtextbrowser
1个回答
0
投票

发生的事情是,readyRead信号不会在收到所有内容后触发,而是在收到某些内容并准备好读取之后触发。

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

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

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

  1. 如果您可以访问数据的发送方,则可以发送在发送实际字符串之前将发送的字节数。它必须始终采用相同大小的整数类型(例如,始终为quint32)。然后,在readSerialPort()中,您将首先读取该大小,然后继续在readSerialPort()中读取缓冲区中的字节,直到收到所有内容。然后,你最终可以打印出来。我推荐一个。它也是几乎所有出现此问题的情况下使用的内容。
  2. 如果您可以访问数据的发送者,则可以在字符串的末尾发送某种“结束序列”。在readSerialPort()中,您将继续将字节读入缓冲区,直到收到结束序列。收到结束序列后,您可以打印之前的所有内容。请注意,结束序列本身可能会被中断,因此您也必须处理这个问题。
  3. 如果您无法访问发件人,我可以提出的最好的想法是使用计时器。您将所有内容放入缓冲区并在每次调用readSerialPort()时重新启动该计时器。当计时器用完时,这意味着暂时没有发送新数据,您可以打印到目前为止所拥有的数据。这是......有风险的,如果有任何其他方式我不会推荐它。
© www.soinside.com 2019 - 2024. All rights reserved.