QComboBox expand event
От: reider  
Дата: 09.02.22 05:36
Оценка:
Доброго времени суток.
Есть вопрос по QT 4.x
Как мне отловить открытие списка ?
Перебрал уже все сигналы, но ничего не нашёл...
Подскажите пожалуйста как это сделать без переопределоения класса?
Заранее благодарен.
Re: QComboBox expand event
От: Chorkov Россия  
Дата: 09.02.22 08:01
Оценка: 7 (2)
Здравствуйте, reider, Вы писали:

R>Доброго времени суток.

R>Есть вопрос по QT 4.x
R>Как мне отловить открытие списка ?
R>Перебрал уже все сигналы, но ничего не нашёл...
R>Подскажите пожалуйста как это сделать без переопределоения класса?
R>Заранее благодарен.

Можно подключиться к сигналам (или событиям) виждета, который установлен в качетсве view.

#include <QApplication>
#include <QComboBox>
#include <QDebug>
#include <QAbstractItemView>

#include "eventstosignals.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QComboBox w;
    w.addItems({"a", "bb", "cccc", "ddddd"});
    
    connectEvent( w.view(), QEvent::Show, [](QObject */*watched*/, QEvent */*event*/){
        qDebug()<<"Show popo-up view";
    });
    
    w.show();
    return a.exec();
}


  eventstosignals.h
// eventstosignals.h
#ifndef EVENTSTOSIGNALS_H
#define EVENTSTOSIGNALS_H

#include <QObject>
#include <QEvent>

class EventsToSignals : public QObject
{
    Q_OBJECT
    const QEvent::Type type;
public:
    EventsToSignals(QObject*parent, QEvent::Type t = QEvent::None )
        : QObject(parent), type(t)
    {
        parent->installEventFilter(this);
    }

signals:
    void onEvent(QObject *watched, QEvent *event);

private:
    bool eventFilter(QObject *watched, QEvent *event)
    {
        bool handled = QObject::eventFilter(watched, event);
        if( type==QEvent::None || type==event->type() )
            emit onEvent(watched, event);
        return handled;
    }
};

template<typename ... Args >
auto connectEvent(QObject *obj, QEvent::Type t, Args ... args)
{
    return obj->connect( new EventsToSignals(obj, t), &EventsToSignals::onEvent, 
                         args... );
}
template<typename ... Args >
auto connectEvent(QObject *obj, Args ... args)
{
    return obj->connect( new EventsToSignals(obj), &EventsToSignals::onEvent, 
                         args... );
}
#endif // EVENTSTOSIGNALS_H
Re[2]: QComboBox expand event
От: reider  
Дата: 10.02.22 04:53
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте, reider, Вы писали:


R>>Доброго времени суток.

R>>Есть вопрос по QT 4.x
R>>Как мне отловить открытие списка ?
R>>Перебрал уже все сигналы, но ничего не нашёл...
R>>Подскажите пожалуйста как это сделать без переопределоения класса?
R>>Заранее благодарен.

C>Можно подключиться к сигналам (или событиям) виждета, который установлен в качетсве view.


C>
C>#include <QApplication>
C>#include <QComboBox>
C>#include <QDebug>
C>#include <QAbstractItemView>

C>#include "eventstosignals.h"

C>int main(int argc, char *argv[])
C>{
C>    QApplication a(argc, argv);
C>    QComboBox w;
C>    w.addItems({"a", "bb", "cccc", "ddddd"});
    
C>    connectEvent( w.view(), QEvent::Show, [](QObject */*watched*/, QEvent */*event*/){
C>        qDebug()<<"Show popo-up view";
C>    });
    
C>    w.show();
C>    return a.exec();
C>} 
C>


C>
  eventstosignals.h
C>
C>// eventstosignals.h
C>#ifndef EVENTSTOSIGNALS_H
C>#define EVENTSTOSIGNALS_H

C>#include <QObject>
C>#include <QEvent>

C>class EventsToSignals : public QObject
C>{
C>    Q_OBJECT
C>    const QEvent::Type type;
C>public:
C>    EventsToSignals(QObject*parent, QEvent::Type t = QEvent::None )
C>        : QObject(parent), type(t)
C>    {
C>        parent->installEventFilter(this);
C>    }

C>signals:
C>    void onEvent(QObject *watched, QEvent *event);

C>private:
C>    bool eventFilter(QObject *watched, QEvent *event)
C>    {
C>        bool handled = QObject::eventFilter(watched, event);
C>        if( type==QEvent::None || type==event->type() )
C>            emit onEvent(watched, event);
C>        return handled;
C>    }
C>};

C>template<typename ... Args >
C>auto connectEvent(QObject *obj, QEvent::Type t, Args ... args)
C>{
C>    return obj->connect( new EventsToSignals(obj, t), &EventsToSignals::onEvent, 
C>                         args... );
C>}
C>template<typename ... Args >
C>auto connectEvent(QObject *obj, Args ... args)
C>{
C>    return obj->connect( new EventsToSignals(obj), &EventsToSignals::onEvent, 
C>                         args... );
C>}
C>#endif // EVENTSTOSIGNALS_H
C>




Огромное спасибо!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.