#include <QPainter>
#include <QPaintEvent>
#include <QTextEdit>
#include <QTextBlock>
#include <QTextLayout>
#include <QScrollBar>
#include <QApplication>
{
public:
{
QString txt
= "eat me...\ndrink me...\n";
for ( int i = 0; i < 8; ++i )
txt += txt;
document()->setPlainText(txt);
}
inline void setMargins(int l, int r, int t, int b)
{ setViewportMargins(l, r, t, b); }
};
{
public:
SamplePanel(SampleArea *a)
{
setFixedWidth(50);
setFixedHeight(a->height());
connect(a->verticalScrollBar() , SIGNAL( valueChanged(int) ),
this , SLOT ( update() ));
a->setMargins(50, 0, 0, 0);
}
protected:
{
e->accept();
int m_lineNumber = 1;
const int ascent = fontMetrics().ascent() + 1;
int contentsY = m_area->verticalScrollBar()->value();
qreal pageBottom = contentsY + m_area->viewport()->height();
for ( ; block.isValid(); block = block.next(), ++m_lineNumber )
{
QPointF position
= layout
->position
();
const QRectF boundingRect
= layout
->boundingRect
();
if ( position.y() + boundingRect.height() < contentsY )
continue;
if ( position.y() > pageBottom )
break;
p.drawText(width() - fm.width(txt) - 2, qRound(position.y()) - contentsY + ascent, txt);
}
}
private:
SampleArea *m_area;
};
int main (int argc, char **argv)
{
SampleArea area;
SamplePanel panel(&area);
area.show();
return app.exec();
}
#include <QPainter>
#include <QPaintEvent>
#include <QTextEdit>
#include <QTextBlock>
#include <QTextLayout>
#include <QScrollBar>
#include <QApplication>
class SampleArea : public QTextEdit
{
public:
SampleArea(QWidget *p = 0)
: QTextEdit(p)
{
QString txt = "eat me...\ndrink me...\n";
for ( int i = 0; i < 8; ++i )
txt += txt;
document()->setPlainText(txt);
}
inline void setMargins(int l, int r, int t, int b)
{ setViewportMargins(l, r, t, b); }
};
class SamplePanel : public QWidget
{
public:
SamplePanel(SampleArea *a)
: QWidget(a), m_area(a)
{
setFixedWidth(50);
setFixedHeight(a->height());
connect(a->verticalScrollBar() , SIGNAL( valueChanged(int) ),
this , SLOT ( update() ));
a->setMargins(50, 0, 0, 0);
}
protected:
virtual void paintEvent(QPaintEvent *e)
{
e->accept();
QPainter p(this);
int m_lineNumber = 1;
const QFontMetrics fm = fontMetrics();
const int ascent = fontMetrics().ascent() + 1;
QTextBlock block = m_area->document()->begin();
int contentsY = m_area->verticalScrollBar()->value();
qreal pageBottom = contentsY + m_area->viewport()->height();
for ( ; block.isValid(); block = block.next(), ++m_lineNumber )
{
QTextLayout* layout = block.layout();
QPointF position = layout->position();
const QRectF boundingRect = layout->boundingRect();
if ( position.y() + boundingRect.height() < contentsY )
continue;
if ( position.y() > pageBottom )
break;
const QString txt = QString::number( m_lineNumber );
p.drawText(width() - fm.width(txt) - 2, qRound(position.y()) - contentsY + ascent, txt);
}
}
private:
SampleArea *m_area;
};
int main (int argc, char **argv)
{
QApplication app(argc, argv);
SampleArea area;
SamplePanel panel(&area);
area.show();
return app.exec();
}
To copy to clipboard, switch view to plain text mode
Bookmarks