1

我正在尝试通过QTextBrowser显示来自串行端口的传入数据来制作串行终端程序。我设置了QTimer每 100 毫秒调用一次paintEvent,QTextBrowser如果在串行端口上收到任何内容,则在小部件上显示字符。

我的问题是,每次我在 中间单击 say 时QTextBrowser,就好像光标移动了,然后在所有后续 上ui->tbOutput->insertPlainText(QString(buf));,只有一半QTextBrowser得到更新。

当我单击QTextBrowser小部件的底部时,整体QTextBrowser再次更新。

这是我拥有的代码,在其他各种文章中,我尝试滚动到底部,并将文本光标移动到末尾,但它并没有达到我想要的效果。

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    static char buf[10240];

    if (terminal->serialport.bytesAvailable() > 0)
    {
        // sizeof(buf)-1 so that there is space for zero termination character
        qint64 numread = terminal->serialport.read(buf,sizeof(buf)-1); 

        if ((numread > 0) && (numread < sizeof(buf)))
        {
            buf[numread] = 0; // set zero termination
            ui->tbOutput->insertPlainText(QString(buf));
            ui->tbOutput->verticalScrollBar()->setValue(
                ui->tbOutput->verticalScrollBar()->maximum());

            ui->tbOutput->textCursor().setPosition(QTextCursor::End);
        }
    }
}
4

1 回答 1

3

一些东西:

这里修改后的代码:

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    static char buf[10240];

    if (terminal->serialport.bytesAvailable() > 0)
    {
        // sizeof(buf)-1 so that there is space for zero termination character
        qint64 numread = terminal->serialport.read(buf,sizeof(buf)-1); 

        if ((numread > 0) && (numread < sizeof(buf)))
        {
            buf[numread] = 0; // set zero termination
            auto textCursor = ui->tbOutput->textCursor();
            textCursor.movePosition(QTextCursor::End);
            ui->tbOutput->setTextCursor(textCursor);
            ui->tbOutput->insertPlainText(QString(buf));
            ui->tbOutput->verticalScrollBar()->setValue(
                ui->tbOutput->verticalScrollBar()->maximum());
        }
    }
}

另一方面,一些额外的考虑:

  • QIODevice::read(char* data, qint64 maxSize)将读取最多maxSize字节,因此无需检查读取字节数是否小于缓冲区。
  • 不要在 中进行paintEvent,它不是读取数据的地方,而是显示数据的地方。ui->tbOutput->update()相反,将计时器与插槽连接并在那里读取数据并仅在新数据到达时重新绘制控制台( )。
于 2017-05-05T14:04:55.463 回答