Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ecspertiza от Октябрь 14, 2010, 16:21



Название: QTextEdit и Whell event
Отправлено: ecspertiza от Октябрь 14, 2010, 16:21
Есть QScrollArea в ней несколько QTextEdit, стало быть если прокручиваю колесиком находясь мышкой на QTextEdit то QScrollArea не прокручивается. Как реализовать передачу события QScrollArea как это происходит если бы внутри находился обычный виджет?


Название: Re: QTextEdit и Whell event
Отправлено: marbius от Октябрь 14, 2010, 19:37
Нужно наследовать класс от QTextEdit, в котором переопределить wheelEvent (QWheelEvent e), а из своего класса транслировать событие в QScrollArea. В общем, как-то так:

MyTextEdit.h
Код
C++ (Qt)
class MyTextEdit : public QTextEdit
{
   Q_OBJECT
public:
   explicit MyTextEdit(QWidget *parent = 0);
 
protected:
   void wheelEvent(QWheelEvent *e);
 
};
 

MyTextEdit.cpp
Код
C++ (Qt)
MyTextEdit::MyTextEdit(QWidget *parent) :
   QTextEdit(parent)
{
}
 
void MyTextEdit::wheelEvent(QWheelEvent *e)
{
   QApplication::sendEvent(this->parent(),e);
}
 

и добавление в QScrollArea как-то так:
Код
C++ (Qt)
QWidget *w=new QWidget();
w->setGeometry(QRect(0,0,800,500));
 
MyTextEdit *e1 = new MyTextEdit (w);
e1->setGeometry(QRect(10,10,100,30));
 
MyTextEdit *e2 = new MyTextEdit (w);
e2->setGeometry(QRect(10,50,100,30));
 
scrollArea->setWidget(w);
 


Название: Re: QTextEdit и Whell event
Отправлено: ecspertiza от Октябрь 14, 2010, 20:38
Нашел вариант попроще, нужно QTextArea установить эвент фильтр

QTextArea::viewport()->installEventFilter();

а в процедуре обработки фильтра написать

bool eventFilter(QObject *o, QEvent *e)
{
     if (o == QTextArea::viewport() && e->type() == QEvent::Wheel)
     {
           e->ignore();
           return true;
     }

      return false;
}


Название: Re: QTextEdit и Whell event
Отправлено: marbius от Октябрь 15, 2010, 18:17
Нашел вариант попроще....

Спасибо, приму к сведению, а то я уже "помешался" на наследованиях ;-)