Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ В QTabWidget не работает installEventFilter()

Автор: DruidCat 1.3.2017, 7:38

Друзья помогите, очень долгое время читал форумы и не нашёл ответа на свою проблемму, а ума самому решить её не хватает. Обращаюсь к вам, помогите.
У меня в программе есть вкладки 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

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 1.3.2017, 10:03

Цитата(Алексей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

Если вы хотите считать время простоя программы, то лучше отлавливать события на QApplication, а не на каждом виджете.

Автор: DruidCat 1.3.2017, 10:32

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

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


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

Автор: lanz 1.3.2017, 10:33

qApp->installEventFilter(this)

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

Автор: DruidCat 1.3.2017, 12:19

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

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


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

Спасибо тебе дружище!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)