Russian Qt Forum
Ноябрь 25, 2024, 09:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Плавный скроллинг мышью QPlainTextEdit  (Прочитано 3434 раз)
Hordi
Гость
« : Декабрь 24, 2008, 13:32 »

Необходим сабж.
Учитывая, что QPlainTextEdit идет от QScrollArea, переопределил mouseMoveEvent. Проблема в том, что двигать могу только через ScrollBars, а их дискретность совсем не соответствует одному пикселю, т.е. setValue(1) и setValue(2) - это уже пикселей 17 (строка текста).
Есть ли выход?
Записан
Hordi
Гость
« Ответ #1 : Декабрь 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);
}
Записан
ритт
Гость
« Ответ #2 : Декабрь 24, 2008, 14:11 »

т.е. требуется что-то вроде QAbstractItemView::ScrollMode ?
если да, то придётся реализовывать самостоятельно (можно подглядеть в исходниках QAbstractItemView)
если считаешь, что фича полезная, удет не лишним написать саггест Троллям...
Записан
Hordi
Гость
« Ответ #3 : Декабрь 24, 2008, 17:56 »

Ну не знаю... Полезная-неполезная... Софт пишется под точпад без клавы и юзается активно QGraphicsView - там плавный скроллинг есть, а красиво проскролить текст в редакторе уже нельзя...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.041 секунд. Запросов: 21.