[英]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);
}
}
}
一些東西:
QTextBrowser::textCursor
返回一個副本,因此任何修改都不會應用於文檔 QTextBrowser::setPosition
將光標移動到絕對位置,因此,您始終移動到位置11( QTextCursor::End
int值)。 使用QTextBrowser::movePosition
代替 這里是修改后的代碼:
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.