gpt4 book ai didi

c++ - 如何让 QTextBrowser 始终在末尾插入文本

转载 作者:行者123 更新时间:2023-11-30 03:31:58 27 4
gpt4 key购买 nike

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

我的问题是,每次我在 QTextBrowser 中间单击 say 时,就好像光标移动然后在所有后续 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);
}
}
}

最佳答案

一些事情:

修改后的代码:

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())。

关于c++ - 如何让 QTextBrowser 始终在末尾插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com