簡體   English   中英

如何使QTextBrowser始終在末尾插入文本

[英]How to get QTextBrowser to always insert text at the end

我試圖通過使用QTextBrowser顯示來自串行端口的傳入數據來制作串行終端程序。 我設置了一個QTimer ,每隔100ms調用一次paintEvent,並在串行端口上收到任何內容時,在QTextBrowser小部件上顯示字符。

我的問題是,每次我單擊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);
        }
    }
}

一些東西:

這里是修改后的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM