Russian Qt Forum
Мая 07, 2025, 11:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit и Whell event  (Прочитано 2609 раз)
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.076 секунд. Запросов: 23.