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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: eventFilter  (Прочитано 13849 раз)
Wander
Гость
« : Март 12, 2009, 15:12 »

Помогите осмыслить ошибку.

MainWindow.h
Код:
protected:
    bool eventFilter(QObject *obj, QEvent *event);

MainWindow.cpp
Код:
...
ui->label_1->installEventFilter(this);
...

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
  {
      if (obj == ui->label_1) {
          if (event->type() == QEvent::MouseMove ) {
              return true;
              ui->label_1->setStyleSheet("color: rgb(21, 103, 255)");
              } else {
                     return false;
                      }
          }

  }



Это я хочу, что б по наведению курсора на виджет label_1 - он окрасился в другой цвет - НО ОН ЧЕТО НЕ КРАСИТСЯ !!
Может я где-то не правильно сделал Непонимающий??
Записан
Crazy Sage
Гость
« Ответ #1 : Март 12, 2009, 15:21 »

http://www.prog.org.ru/topic_7215_0.html
может поможет
Записан
BRE
Гость
« Ответ #2 : Март 12, 2009, 15:34 »

MainWindow.h
Код:
...
          if (event->type() == QEvent::MouseMove ) {
              return true;
              ui->label_1->setStyleSheet("color: rgb(21, 103, 255)");
              }
...
Тебя здесь ничего не смущает?
 Подмигивающий
Записан
igor_bogomolov
Гость
« Ответ #3 : Март 12, 2009, 15:34 »

А это что?
Цитировать
              return true;
              ui->label_1->setStyleSheet("color: rgb(21, 103, 255)");

Поменяйте местами.
Записан
Wander
Гость
« Ответ #4 : Март 12, 2009, 19:17 »

Ммммм - да !
Сразу и не заметил.
Спасибки.
Записан
Wander
Гость
« Ответ #5 : Март 12, 2009, 20:23 »

Простите, а можно еще один вопрос:

Если я немного подкорректирую этот пример так:
Вместо MouseMove впишу MouseButtonPress

if (event->type() == QEvent::MouseButtonPress ) {
              ui->label_1->setStyleSheet("color: rgb(21, 103, 255)");
              return true;
              }

то я сразу же предполагал что ничего не произойдет по клику мышкой, так как, наверняка, неизвестно по нажатию какой клавиши обработать событие  (Левой или Правой) - ведь они принадлежат к класу QMouseEvent.
Вопрос:
Если все же в QEvent  присудствует MouseButtonPress, то как это допилить в моем примере Непонимающий
Записан
spirit
Гость
« Ответ #6 : Март 12, 2009, 20:26 »

ну должно работать, только при нажатии на любую клавишу мышки код будет выполнятся.
а если же все-таки нужно фильтровать клавиши, то нужно привести QEvent к QMouseEvent
и воспользоваться методом QMouseEvent::button.
Записан
Wander
Гость
« Ответ #7 : Март 12, 2009, 20:37 »

Ну, когда я нажимаю клавишу мышки, то ничего не происходит.
И как теперь быть - если мне хочется, что б Лейбл окрасился по навидению, и выполнил действие по нажатию?
Записан
spirit
Гость
« Ответ #8 : Март 12, 2009, 21:14 »

держи
Код
C++ (Qt)
Test::Test(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout *hbl = new QHBoxLayout(this);
l = new QLabel;
l->setMouseTracking(true);
l->installEventFilter(this);
hbl->addWidget(l);
}
 
bool Test::eventFilter(QObject *o, QEvent *e)
{
if (o == l) {
if (e->type() == QEvent::MouseButtonPress) {
l->setStyleSheet("QLabel {background: red}");
} else if (e->type() == QEvent::MouseMove) {
l->setStyleSheet("QLabel {background: blue}");
}
}
return QWidget::eventFilter(o, e);
}
 
« Последнее редактирование: Март 12, 2009, 21:25 от spirit » Записан
Wander
Гость
« Ответ #9 : Март 13, 2009, 10:07 »

Спасибо.
Все чего не хватало так это сделать setMouseTracking(true); и все заработало.

С уважением!
Записан
faithman
Гость
« Ответ #10 : Март 14, 2009, 16:34 »

Пишу вопрос здесь,тема подходит.

Есть код:

Конструктор:
 pathEdit = new QComboBox(this);
    pathEdit->setEditable(true);
    pathEdit->setInsertPolicy(QComboBox::NoInsert);
    pathEdit->installEventFilter(this);

Реализация:

bool QFileBox::eventFilter( QObject * watched, QEvent * event )
{
   if (watched->inherits("QComboBox"))
   {
      if (event->type() == QEvent::KeyPress)    <---- это на все клавиши срабатывает !
      {
         onChangedPathEdit(); 
      }
   }
   return false;
}

Хочу чтоб мой onChangedPathEdit() вызывался только при нажатии "Enter", как сделать ?
Сори ,за тупой вопрос.
Записан
Khs
Гость
« Ответ #11 : Март 14, 2009, 16:45 »

Код:
if (event->type() == QEvent::KeyPress) 
{
    QKeyEvent *ke = static_cast<QKeyEvent *>(event);
    if (ke->key() == Qt::Key_Enter) {...}
}

? Улыбающийся
Записан
faithman
Гость
« Ответ #12 : Март 17, 2009, 18:36 »

Есть ещё вопрос:

не работает вот этот код:

//Обработка событий объектов
bool QFileBox::eventFilter( QObject * watched, QEvent * event )
{
   if (watched->objectName()=="treeView")
   {
      if (event->type() == QEvent::MouseButtonPress)
      {
         QMouseEvent * key = static_cast<QMouseEvent *>(event);
         if (key->button() == Qt::LeftButton)
         {
            //onClickDir(indexOnClickDir);
            pathEdit->setText("событие");
         }
      }
   }
   return false;
}

Если поставить по примеру ,как в ассистенте, вместо QMouseEvent использовать QKeyEvent ,то код работает.Перевода ассистента у меня нет,пользую английскую версию. Возможно событие как то игнорируется в самом виджете ? Ведь там есть void clicked ( const QModelIndex & index ).
Подскажите пожалуйста !

P/S: Qt 4.4.3 ,mingw, Vista 64
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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