Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: В QTabWidget не работает installEventFilter()
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
DruidCat
Друзья помогите, очень долгое время читал форумы и не нашёл ответа на свою проблемму, а ума самому решить её не хватает. Обращаюсь к вам, помогите.
У меня в программе есть вкладки 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
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
DruidCat
Цитата(Алексей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
Если вы хотите считать время простоя программы, то лучше отлавливать события на QApplication, а не на каждом виджете.
DruidCat
Цитата(lanz @ 1.3.2017, 12:13) *
Если вы хотите считать время простоя программы, то лучше отлавливать события на QApplication, а не на каждом виджете.

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


А то мне приходится всё прописывать ручками. :-(
lanz
qApp->installEventFilter(this)

Вместо всех фильтров.
http://doc.qt.io/Qt-5/qapplication.html#qApp
DruidCat
Цитата(lanz @ 1.3.2017, 12:33) *
qApp->installEventFilter(this)

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


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

Спасибо тебе дружище!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2017 IPS, Inc.