Есть ли способ отложить Qt QEvent? - PullRequest
3 голосов
/ 21 марта 2012

Есть ли способ отложить продолжение QEvent в Qt?

Этот фрагмент кода просто показывает вам, что я хочу сделать:

QList<QEvent*> waited_events;

...

bool MyQWidget::event(QEvent * event)
{
    if (event->type() == QEvent::KeyPress)
    {
        waited_events.append(event);
        QTimer::singleShot(100, this, SLOT(timer()));  
        return true;
    } else
    return QWidget::event(event);
}

...

void MyQWidget::timer()
{
    if (!waited_actions.isEmpty())
    {
        QEvent* event = waited_events.takeFirst();
        QWidget::event(event);
    }
}

Спасибо!

1 Ответ

0 голосов
/ 24 марта 2012

Как правило, вы не хотите хранить QEvents, которые запускаются QWidgets.

Отправленный вами фрагмент кода верен, если вы хотите отложить обработку QEvent. Однако ваш фрагмент кода не будет делать то, что вы хотите, потому что когда это:

void MyQWidget::timer()
{
    if (!waited_actions.isEmpty())
    {
        QEvent* event = waited_events.takeFirst();
        QWidget::event(event);
    }
}

получает вызов, ваше QEvent уже удалено, поэтому waited_events всегда будет пустым.

Если вам нужно MyQWidget, чтобы использовать этот подход, вам придется создать новое событие (как предложил Ф. Остерфельд). Я не уверен на 100%, но похоже, что вы просто пытаетесь поймать QEvent::KeyPress. Если это так, то простым способом является MyQWidget переопределить void QWidget::keyPressEvent(QKeyEvent* event).

...