Игнорировать события мыши и клавиатуры в Qt - PullRequest
10 голосов
/ 05 февраля 2010

В Qt, как я могу игнорировать все события мыши и клавиатуры, а затем перестать их игнорировать? То есть: нажмите кнопку, игнорируйте все события у детей; нажмите еще раз, не игнорируйте. Это понятно? У меня есть следующие строки, но, возможно, я делаю что-то не так:

setAttribute(Qt::WA_TransparentForMouseEvents);

setFocusPolicy(Qt::NoFocus);

Ответы [ 4 ]

11 голосов
/ 27 января 2013

Не используйте setFocusPolicy (Qt :: NoFocus); и это будет распространять события на родителя. Используйте только setAttribute (Qt :: WA_TransparentForMouseEvents);

8 голосов
/ 05 февраля 2010

Вы можете использовать фильтры событий для событий мыши и клавиатуры, чтобы отфильтровать нажатие клавиш или щелчок мышью, когда вам это необходимо:

yourWidget->installEventFilter(this);

...

bool YourFrm::eventFilter(QObject* pObject, QEvent* pEvent)
{
    if (pEvent->type() == QEvent::KeyPress) 
    {
        QKeyEvent* pKeyEvent = static_cast<QKeyEvent*>(pEvent);
        int PressedKey = pKeyEvent->key();

        if(PressedKey == Qt::Key_Return)
        {
            // Filter Return key....
            return true;
        }

        // standard event processing
        return QObject::eventFilter(pObject, pEvent);
    }
    else if (pEvent->type() == QEvent::MouseButtonPress) 
    {
        QMouseEvent* pMouseEvent = static_cast<QMouseEvent*>(pEvent);

        ... // etc...
    }
    else 
    {
        // standard event processing
        return QObject::eventFilter(pObject, pEvent);
    }
}

Более подробная информация по этому вопросу: http://qt.nokia.com/doc/4.6/eventsandfilters.html

Надеюсь, это поможет!

5 голосов
/ 05 февраля 2010

Вы можете использовать:

QWidget::setEnabled(false)

отключает события мыши и клавиатуры для виджета.

4 голосов
/ 05 февраля 2010

Вы имеете в виду QGraphicsItem?

Если да, вы можете позвонить

void QGraphicsItem::setEnabled ( bool enabled )

И чтобы активировать событие позже, так как элемент больше не получает события, вы должны пройти мимо Сцены, потому что вы не можете напрямую получить событие для элемента.
Если ваша проблема не в использовании GraphicsView Frameworks, а в другой части qt, это почти тот же процесс:
Вы можете позвонить:

QWidget::setEnabled(false) //like Massimo said

Чтобы реактивировать виджет, просто определите событие нажатия внутри объекта в вашем приложении, чтобы иметь возможность вызвать `setEnable (true) для вашего виджета!

Надеюсь, это поможет! `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...