Seite 1 von 1

QTextBrowser im Chat-Programm

Verfasst: 4. Oktober 2008 11:05
von D.Cent
Hallo,

ich bin gerade dabei, ein eigenes Chat-Programm für ein Spiel zu schreiben.
Sobald jemand etwas schreibt, soll es in einem QTextBrowser erscheinen.

Das funktioniert soweit auch ganz gut, z.B. sieht das dann so aus:
D.Cent: Hallo!
D.Cent: Das ist ein Test.
Sobald ich aber z.B. zwischen die beiden Sätze klicke, und dann jemand etwas schreibt, wird der Text an der falschen Stelle eingefügt, und das, obwohl man in dem TextBrowser nicht editieren kann:
D.Cent: HalD.Cent: 2ter Test
lo!
D.Cent: Das ist ein Test.
Ich habe mir gedacht, dass ich einfach bei jedem Klick bloss den QTextCursor an das Ende setzen muss, was ich kurzerhand über das Signal "cursorPositionChanged" gemacht habe (mit QTextCursor tc; textbrowser.setCursor(tc.movePosition(QTextCursor::End)).

Doch leider hat das nichts geändert.
Hat jemand eine Idee, wie ich diese Eigenschaft deaktivieren kann?

Verfasst: 4. Oktober 2008 12:21
von CaptnChaos
QTextCursor tc; textbrowser.setCursor(tc.movePosition(QTextCursor::End)).
das schreib mal bevor du text in den qtextbrowser einfügst.

Verfasst: 4. Oktober 2008 12:22
von CaptnChaos
oder benutze einen qstring in dem du die nachrichten pufferst. sprich erst mal alles an den string anhängst und dann textBrowser->setText(pufferString) aufrufst.

Verfasst: 10. Oktober 2008 17:30
von D.Cent
Danke für Deine Antwort, KernelPanic, doch das funktioniert leider nicht :-/

Verfasst: 10. Oktober 2008 21:04
von upsala
Verwende ein QListWidget stattdessen...

Verfasst: 10. Oktober 2008 22:08
von D.Cent
Das unterstützt leider kein HTML.

Verfasst: 10. Oktober 2008 22:24
von upsala
Wer sagt das?

Verfasst: 10. November 2008 14:42
von Eltharion
Mit einem QTextEdit funktioniert das sehr gut so:

Code: Alles auswählen

void ViewPlayer::cursorDown()
{
  QTextCursor cursor = m_editor.textCursor();

  cursor.clearSelection();
  cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor, 1);

  m_editor.setTextCursor(cursor);
}

void ViewPlayer::scrollDown()
{
  QScrollBar *sb;
  
  sb = m_editor.verticalScrollBar();
  if (sb)
    sb->setValue(sb->maximum());

  sb = m_editor.horizontalScrollBar();
  if (sb)
    sb->setValue(0);
}

void ViewPlayer::insertText(const QString &text, unsigned int type /*=0*/)
{
  cursorDown();

  QTextCursor cursor = m_editor.textCursor();

  switch (type) {
    case 1:
      cursor.insertText(text, m_fmt_output);
      break;

    case 2:
      cursor.insertText(text, m_fmt_input);
      break;

    default:
      cursor.insertText(text);
  }

  cursorDown();
  scrollDown();

  m_editor.ensureCursorVisible();
}

void ViewPlayer::insertImage(const QString &path)
{
  QTextCursor cursor = m_editor.textCursor();
  QTextImageFormat imageFormat;

  imageFormat.setName(path);
  cursor.insertImage(imageFormat);
}
m_editor ist ein QTextEdit, m_fmt_output vom Typ QTextCharFormat. Alles enthalten in einer Container-Klasse.

Wie man sieht, sollte auch der Scrollbereich nach links gerückt werden und auch ohne QTextBrowser-Fähigkeiten sind farbige Texte, Bilder, usw. möglich. Das habe ich damals für einen MUD-Client so programmiert, in der Hoffnung, dass es schneller wird als ein QTextBrowser. Ich habe aber keine Ahnung, ob es wirklich so ist.

E*

Verfasst: 10. November 2008 14:49
von mathies
Hi,

warum benutzt Du keinen QTextEdit bzw. QPlainTextEdit? Da gibt es die nette Funktion append...(), damit landet das immer net geordnet am Ende.

Verfasst: 10. November 2008 15:29
von CaptnChaos
Sicher funktioniert das mit einem string.... ich machs doch selbst so. :?

Verfasst: 10. November 2008 19:49
von D.Cent
Ok, ihr habt mich überzeugt! Vielen Dank, es geht nun!! :D