Название: Плавный скроллинг мышью QPlainTextEdit
Отправлено: Hordi от Декабрь 24, 2008, 13:32
Необходим сабж. Учитывая, что QPlainTextEdit идет от QScrollArea, переопределил mouseMoveEvent. Проблема в том, что двигать могу только через ScrollBars, а их дискретность совсем не соответствует одному пикселю, т.е. setValue(1) и setValue(2) - это уже пикселей 17 (строка текста). Есть ли выход?
Название: Re: Плавный скроллинг мышью QPlainTextEdit
Отправлено: Hordi от Декабрь 24, 2008, 13:43
Добавлю код... class TextEdit:public QPlainTextEdit{ Q_OBJECT public: TextEdit(QWidget* parent); private: virtual bool event(QEvent*); virtual void mouseMoveEvent ( QMouseEvent * e ); virtual void mousePressEvent ( QMouseEvent * e ); virtual void mouseReleaseEvent ( QMouseEvent * e );
private: QPoint _pnt; int _dh; int _dw; };
TextEdit::TextEdit(QWidget* parent) :QPlainTextEdit(parent) { QFontMetrics fm(font()); _dh = fm.height(); _dw = fm.width(" ");
setFrameShape(QFrame::NoFrame); setReadOnly(true); setContextMenuPolicy(Qt::NoContextMenu); }
void TextEdit::mouseMoveEvent ( QMouseEvent * e ) { if(!_pnt.isNull()){ QScrollBar* pV = verticalScrollBar(); QScrollBar* pH = horizontalScrollBar();
QPoint pnt(e->pos());
int dx = _pnt.x()-pnt.x(); int dy = _pnt.y()-pnt.y();
if(pV->isVisible()){ if(int v = dy / pV->singleStep() / _dh){ v += pV->value(); if(v<pV->minimum()){ v = pV->minimum(); }else if(v>pV->maximum()){ v = pV->maximum(); } pV->setValue(v); }else{ pnt.setY(_pnt.y()); } }
if(pH->isVisible()){ if(int v = dy / pH->singleStep() / _dw){ v += pH->value(); if(v<pH->minimum()){ v = pH->minimum(); }else if(v>pH->maximum()){ v = pV->maximum(); } pH->setValue(v); }else{ pnt.setX(_pnt.x()); } }
_pnt = pnt; } }
void TextEdit::mousePressEvent ( QMouseEvent * e ) { _pnt = e->pos(); }
void TextEdit::mouseReleaseEvent ( QMouseEvent * e ) { _pnt = QPoint(); }
bool TextEdit::event(QEvent* e) { int type = e->type(); switch(type){ case QEvent::Enter:{ _pnt = QPoint(); }break; case QEvent::Leave:{ _pnt = QPoint(); }break; }
return QPlainTextEdit::event(e); }
Название: Re: Плавный скроллинг мышью QPlainTextEdit
Отправлено: ритт от Декабрь 24, 2008, 14:11
т.е. требуется что-то вроде QAbstractItemView::ScrollMode ? если да, то придётся реализовывать самостоятельно (можно подглядеть в исходниках QAbstractItemView) если считаешь, что фича полезная, удет не лишним написать саггест Троллям...
Название: Re: Плавный скроллинг мышью QPlainTextEdit
Отправлено: Hordi от Декабрь 24, 2008, 17:56
Ну не знаю... Полезная-неполезная... Софт пишется под точпад без клавы и юзается активно QGraphicsView - там плавный скроллинг есть, а красиво проскролить текст в редакторе уже нельзя...
|