2017-05-05 11 views
1

QTextBrowserを使用してシリアル端末プログラムを作成しようとしています。私はQTimerをpaintEventを100msごとに呼び出すように設定し、シリアルポートで何かが受信された場合はQTextBrowserウィジェットに文字を表示します。QTextBrowserに最後にテキストを挿入する方法

私の問題は、私がクリックするたびに、カーソルが移動し、それ以降のすべてのui->tbOutput->insertPlainText(QString(buf));にかかわらず、QTextBrowserの半分だけが更新されるかのようにそれは、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); 
     } 
    } 
} 

答えて

1

いくつかのこと:

  • QTextBrowser::textCursorは、したがって、あなたは常に位置に移動され、絶対位置にカーソルを移動しますので、任意の変更は文書
  • QTextBrowser::setPositionに適用されていない、コピーを返します。 11(int値はQTextCursor::Endになります)。 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())。
+0

ありがとうございます。あなたの答えは正しい軌道に乗りました。私はあなたの追加の考慮事項に同意し、私のコードでそれらを実装しました。 –

関連する問題