crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> В QTabWidget не работает installEventFilter()
DruidCat
  опции профиля:
сообщение 1.3.2017, 7:38
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 15.10.2013
Пользователь №: 3958

Спасибо сказали: 0 раз(а)




Репутация:   0  


Друзья помогите, очень долгое время читал форумы и не нашёл ответа на свою проблемму, а ума самому решить её не хватает. Обращаюсь к вам, помогите.
У меня в программе есть вкладки QTableWidget, назвал я их ptwdGlavnaya.
есть фильтр событий.
/*virtual*/ bool DCHelper::eventFilter(QObject* proditel, QEvent* pevent){//переназначаем Фильтр событий                                                
/////////////////////////////////////                                                                        
//---Ф И Л Ь Т Р   С О Б Ы Т И Й---//                                                                        
/////////////////////////////////////                                                                        
    if((pevent->type()==QEvent::MouseButtonPress)||(pevent->type()==QEvent::Wheel)                            
            ||(pevent->type()==QEvent::KeyPress)){//Если произошёл клик мышки или колёсика или клавиатуры,то..
        slotVremyaProstoya();//Обнуляем счётчик времени простоя программы без пользователя.                  
    }                                                                                                        
    return false;//Пропускаем событие на дальнейшую обработку в программе.                                    
}


есть метод прописывающий условия срабатывания фильтра
void DCHelper::adminVremyaProstoya(){//Метод, в котором прописываются правила фильтра события в Администрирова                                          
///////////////////////////////////////////////////////////////////////////                                  
//---Ф И Л Ь Т Р Ы   С О Б Ы Т И Й   А Д М И Н И С Т Р И Р О В А Н И Я---//                                  
///////////////////////////////////////////////////////////////////////////                                  
    this->installEventFilter(this);                                                                                                                                              
    ui->pcmdComLoginVihod->installEventFilter(this);                                                                                                                      
    ui->ptwdGlavnaya->installEventFilter(this);
}


Всё замечательно работает: кнопочки, поля ввода текста и так далее, КРОМЕ ВКЛАДОК:
 ui->ptwdGlavnaya->installEventFilter(this);

Когда я кликаю по ptwdGlavnaya, ничего не происходит. Друзья, подскажите пожалуйста, как мне сделать так, чтобы при нажатии на вкладки ptwdGlavnaya у меня срабатывал фильтр событий?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.3.2017, 8:01
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2936
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 205 раз(а)




Репутация:   35  


DCHelper - кто родитель ? Допустим, QObject

тогда, для начала, неплохо бы вызвать eventFilter родителя
bool DCHelper::eventFilter(QObject* o, QEvent* e)
{
    switch(e->type())
    {
        case QEvent::MouseButtonPress:
        case QEvent::Wheel:
        case QEvent::KeyPress:
        {
            slotVremyaProstoya();
        }break;
    }

    return QObject::eventFilter(o,e);
}


а зачем для самого себя фильтр вызывать ? Или это тоже виджет?
this->installEventFilter(this);

попробуй фильтровать события QTabBar, получить указатель можно так
QTabBar *QTabWidget::tabBar() const


Сообщение отредактировал Алексей1153 - 1.3.2017, 8:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DruidCat
  опции профиля:
сообщение 1.3.2017, 10:03
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 15.10.2013
Пользователь №: 3958

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 1.3.2017, 10:01) *
DCHelper - кто родитель ? Допустим, QObject

тогда, для начала, неплохо бы вызвать eventFilter родителя
bool DCHelper::eventFilter(QObject* o, QEvent* e)
{
    switch(e->type())
    {
        case QEvent::MouseButtonPress:
        case QEvent::Wheel:
        case QEvent::KeyPress:
        {
            slotVremyaProstoya();
        }break;
    }

    return QObject::eventFilter(o,e);
}


а зачем для самого себя фильтр вызывать ? Или это тоже виджет?
this->installEventFilter(this);

попробуй фильтровать события QTabBar, получить указатель можно так
QTabBar *QTabWidget::tabBar() const


Блин, забыл написать про родителя. Родитель QWidget.
Про this->installEventFilter(this); -> это моя глупость.
Про QTabBar я на вашем форуме видел подобный ответ, но я не понимаю, как им воспользоваться. :-(

Цитата(DruidCat @ 1.3.2017, 11:55) *
Цитата(Алексей1153 @ 1.3.2017, 10:01) *
DCHelper - кто родитель ? Допустим, QObject

тогда, для начала, неплохо бы вызвать eventFilter родителя
bool DCHelper::eventFilter(QObject* o, QEvent* e)
{
    switch(e->type())
    {
        case QEvent::MouseButtonPress:
        case QEvent::Wheel:
        case QEvent::KeyPress:
        {
            slotVremyaProstoya();
        }break;
    }

    return QObject::eventFilter(o,e);
}


а зачем для самого себя фильтр вызывать ? Или это тоже виджет?
this->installEventFilter(this);

попробуй фильтровать события QTabBar, получить указатель можно так
QTabBar *QTabWidget::tabBar() const


Блин, забыл написать про родителя. Родитель QWidget.
Про this->installEventFilter(this); -> это моя глупость.
Про QTabBar я на вашем форуме видел подобный ответ, но я не понимаю, как им воспользоваться. :-(

Ура, как всё просто:
ui->ptwdGlavnaya->tabBar()->installEventFilter(this);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 1.3.2017, 10:13
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 908
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 141 раз(а)




Репутация:   9  


Если вы хотите считать время простоя программы, то лучше отлавливать события на QApplication, а не на каждом виджете.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DruidCat
  опции профиля:
сообщение 1.3.2017, 10:32
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 15.10.2013
Пользователь №: 3958

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 1.3.2017, 12:13) *
Если вы хотите считать время простоя программы, то лучше отлавливать события на QApplication, а не на каждом виджете.

Ого, а так можно? А то, мне очень громозко прописывать все элементы форм в разных классах. Я их постоянно дополняю и постоянно нужно в фильтре их прописывать. А не могли бы вы показать кусочек кода, как это можно сделать, а я всё сам потом допилю.


А то мне приходится всё прописывать ручками. :-(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 1.3.2017, 10:33
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 908
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 141 раз(а)




Репутация:   9  


qApp->installEventFilter(this)

Вместо всех фильтров.
http://doc.qt.io/Qt-5/qapplication.html#qApp

Сообщение отредактировал lanz - 1.3.2017, 10:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DruidCat
  опции профиля:
сообщение 1.3.2017, 12:19
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 15.10.2013
Пользователь №: 3958

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 1.3.2017, 12:33) *
qApp->installEventFilter(this)

Вместо всех фильтров.
http://doc.qt.io/Qt-5/qapplication.html#qApp


Я так себе голову отмучал с этими фильтрами, а нужно было вставить только:
qApp->installEventFilter(this);

Спасибо тебе дружище!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2017, 21:58