QTextEdit Zeilennummern

Verschiedenes zu Qt
Antworten
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

QTextEdit Zeilennummern

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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);
}
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Weil das normale 'paintEvent' auf den viewport() wirkt und nicht auf das Gesamt-Widget.
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag 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 :/
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

die Event-Methode ist protected, da sie von QObject kommt.

Ich werde später mal den gesamten Code reinstellen.
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Hier der Code. Lauffähig unter Qt4.3.0. Ich kann im Moment keine Dateien hochladen. Deswegen gibts den Download hier.
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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)
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann zeichne Du eben einfach nach QTextEdit::event(event) und nicht davor...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
CSchirner
Beiträge: 63
Registriert: 14. Dezember 2006 11:05

Beitrag von CSchirner »

Funktioniert ;)

Damn!

Vielen Dank ;))
Antworten