Seite 1 von 1

QTextEdit Zeilennummern

Verfasst: 3. September 2007 14:03
von CSchirner
Hi,

gibt es irgendeine möglichkeit, ein QTextEdit mir Zeilennummern zu versehen, an der linken seite...

einzige möglichkeit die mir eingefallen ist, ist ein 2. QTextEdit links daneben zu machen, und mit dem anderen QTextEdit zusammen zu scrollen...

Hat jemand ne andere Idee?

MFG
Christopher Schirner

Verfasst: 3. September 2007 20:20
von upsala
Nur so als Grundlage: (Dank auch an den Autor von QDevelop, bei dem ich mir ein paar Zeilen ausgeliehen habe...)

Code: Alles auswählen

Edit::Edit(QWidget *parent)
  : QTextEdit(parent)
{
  setViewportMargins(50, 0, 0, 0);
	
  connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(update()));
  connect(this, SIGNAL(textChanged()), this, SLOT(update()));
}

bool Edit::event(QEvent *event) {
  if (event->type()==QEvent::Paint) {
    QPainter p(this);
    p.fillRect(0, 0, 50, height(), QColor(255, 255, 192));
		
    int contentsY = verticalScrollBar()->value();
    qreal pageBottom = contentsY+viewport()->height();
    int m_lineNumber(1);
    const QFontMetrics fm=fontMetrics();
    const int ascent = fontMetrics().ascent() +1;
		
    for (QTextBlock block=document()->begin(); block.isValid(); block=block.next(), m_lineNumber++) {
      QTextLayout *layout = block.layout();
      const QRectF boundingRect = layout->boundingRect();
      QPointF position = layout->position();
      if ( position.y() +boundingRect.height() < contentsY ) {
        continue;
      }
      if ( position.y() > pageBottom ) {
        break;
      }
      const QString txt = QString::number(m_lineNumber);
      p.drawText(50-fm.width(txt)-2, qRound(position.y())-contentsY+ascent, txt); 
      }
    }

    return QTextEdit::event(event);
}

Verfasst: 4. September 2007 08:40
von CSchirner
wenn ich das richtig sehe, malst du dir das an die linke seite....
die frage die mir als erstes eingefallen ist... warum nutzt du nicht den paintEvent sondern das normale event und fragst dann nach "Paint" ab?

Verfasst: 4. September 2007 09:04
von upsala
Weil das normale 'paintEvent' auf den viewport() wirkt und nicht auf das Gesamt-Widget.

Verfasst: 4. September 2007 09:15
von CSchirner
okay ich hab etz mal deine methode kopiert... und mal nur das farbige "rect" malen lassen... es erscheint aber kein rect... die funktion wird dennoch aufgerufen...

die 50px seitenabstand sind auch mit drin (kommt ja von setViewportMargins(50, 0, 0, 0);) ... was könnte ich vergessen haben... die event methode hab ich private gemacht... sollte ja auch passen, oder?


-- keine chance... brings net hin :/

Verfasst: 4. September 2007 12:14
von upsala
die Event-Methode ist protected, da sie von QObject kommt.

Ich werde später mal den gesamten Code reinstellen.

Verfasst: 4. September 2007 12:22
von CSchirner
Ich hab diese Methode ja überladen... bzw in meiner Klasse implementiert... die Funktion bzw auch das p.fillRect wird aufgerufen... doch es wird nicht gemalt ;)

Das is das entscheidende Problem :D

Verfasst: 4. September 2007 20:11
von upsala
Hier der Code. Lauffähig unter Qt4.3.0. Ich kann im Moment keine Dateien hochladen. Deswegen gibts den Download hier.

Verfasst: 5. September 2007 08:07
von CSchirner
jo... genauso habs ich... hab auch Qt 4.3 ... doch es funktioniert nicht... der painter wird aufgerufen, wird abers nichts hingezeichnet..

was deine class "LineNumbers" macht, weiss ich übrigens in dem beispiel nicht ;D

Verfasst: 5. September 2007 09:04
von upsala
LineNumbers macht gar nichts. Das ist ein Rest vom Test.

Ich habe eine Vermutung, kann sie aber gerade nicht testen: Es könnte damit zusammenhängen, daß 'mein' Style nur einen Rahmen um das Widget zeichnet. Dein Style aber die Fläche nach unserem Paint löscht. D.h. ein return false/true(?!) noch einfügen. Oder in ein eigenes Widget zeichnen. (So wie es QDevelop auch macht)

Verfasst: 5. September 2007 09:24
von CSchirner
wenn ich einfach nur "return true" anstatt return QTextEdit::event(event) hinschreib, seh ich das gezeichnete... doch dann lässt sich das QTextEdit nicht mehr verwenden... "hängt" komplett... also keine eingaben mehr möglich

Verfasst: 5. September 2007 09:31
von Christian81
Dann zeichne Du eben einfach nach QTextEdit::event(event) und nicht davor...

Verfasst: 5. September 2007 09:47
von CSchirner
Funktioniert ;)

Damn!

Vielen Dank ;))