LINUX.ORG.RU

QComboBox - события вызова меню

 


0

1

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

Код, что есть:

class HoverableComboBox : public QComboBox
{
    Q_OBJECT

public:
    HoverableComboBox() { this->installEventFilter(this); }
    /*~HoverableComboBox();*/

signals:
    void say(QString string);

private:
    void focused(bool state)
    {
        emit say(QString("I'm %1, my focus state is %2").arg(this->objectName()).arg(state));
    }

public:
    bool eventFilter(QObject * object, QEvent * event)
    {
        if (object == this && event->type() == QEvent::KeyPress)
            return true;
        if (object == this && event->type() == QEvent::FocusIn)
            focused(true);
        if (object == this && event->type() == QEvent::FocusOut)
            focused(false);
        if (object == this && event->type() == QEvent::ChildRemoved)
            emit say(QString("I'm %1, and I have message %2").arg(this->objectName()).arg(event->type()));
        return false;
    }
    void paintEvent(QPaintEvent * e)
    {
        QComboBox::paintEvent(e);
    }
};

★★
Ответ на: комментарий от UVV

Это функция. А мне нужно получить снаружи сигнал. По сути:

class HoverableComboBox : public QComboBox
...
signals:
   void opened();
   void closed();
...

Или вы предлагаете переопределит эту функцию? А если где-то код, который это рисует в обход этой функции?

sambist ★★
() автор топика

Фигня у QComboBox, которая показывается - это QComboBox::view(), ты можешь задать свой виджет QComboBox::setView(). Виджет наследуется от QAbstractItemView.

И уже в нем ловить все, что хочешь.

this->installEventFilter(this);

Зачем перехватывать все для себя же???

grondek
()
Ответ на: комментарий от sambist

Решил, может кому когда понадобится:

class HoverableComboBox : public QComboBox
{
    Q_OBJECT

public:
    HoverableComboBox()
    {
        this->installEventFilter(this);
        connect(this, SIGNAL(activated(int)), this, SLOT(preclose()));
    }
    /*~HoverableComboBox();*/

signals:
    void opened();
    void closed();
private slots:
    void preclose()
    {
        emit closed();
    }

private:
public:
    bool eventFilter(QObject * object, QEvent * event)
    {
        if (object == this && event->type() == QEvent::KeyPress)
            return true;
        if (object == this && event->type() == QEvent::FocusIn)
            emit opened();
        if (object == this && event->type() == QEvent::MouseButtonPress)
            emit opened();
        return false;
    }
    void paintEvent(QPaintEvent * e)
    {
        QComboBox::paintEvent(e);
    }
};

sambist ★★
() автор топика

Когда меню закрылось.

void QComboBox::activated ( int index ) [signal] This signal is sent when the user chooses an item in the combobox. The item's index is passed. Note that this signal is sent even when the choice is not changed. If you need to know when the choice actually changes, use signal currentIndexChanged().

khenty
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.