QTextEdit Zeilennummern
QTextEdit Zeilennummern
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
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
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);
}
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 :/
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 :/
Hier der Code. Lauffähig unter Qt4.3.0. Ich kann im Moment keine Dateien hochladen. Deswegen gibts den Download hier.
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)
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)
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: