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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit и Whell event  (Прочитано 2513 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Октябрь 14, 2010, 16:21 »

Есть QScrollArea в ней несколько QTextEdit, стало быть если прокручиваю колесиком находясь мышкой на QTextEdit то QScrollArea не прокручивается. Как реализовать передачу события QScrollArea как это происходит если бы внутри находился обычный виджет?
Записан
marbius
Гость
« Ответ #1 : Октябрь 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);
 
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Октябрь 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;
}
Записан
marbius
Гость
« Ответ #3 : Октябрь 15, 2010, 18:17 »

Нашел вариант попроще....

Спасибо, приму к сведению, а то я уже "помешался" на наследованиях ;-)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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