【问题标题】:Is there any way to delay Qt QEvent?有什么办法可以延迟 Qt QEvent?
【发布时间】:2012-03-21 18:29:49
【问题描述】:

有什么方法可以延迟 Qt 中 QEvent 的进行吗?

这段代码只是告诉你我想要做什么:

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);
    }
}

谢谢!

【问题讨论】:

  • 这个有什么问题?
  • 您可以使用该方法,但您必须创建一个新事件。你可以使用 QCoreApplication::postEvent/sendEvent 来处理它。
  • @LucaCarlon 这行不通,因为当 timer() 函数即将被调用时,他保存的 QEvent* 对象将被销毁。
  • 好吧,我可以创建与我已经收到的完全相同的新活动吗?
  • 不,不幸的是QEvent 没有实现虚拟复制构造函数成语parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8。无法克隆任意 QEvent,但您可以编写一个函数来克隆您可能感兴趣的事件。

标签: qt qt4 qevent


【解决方案1】:

作为一般规则,您不希望存储由 QWidgets 触发的 QEvents。

如果您想延迟 QEvent 的处理,您发布的代码 sn-p 是正确的。但是,您的代码 sn-p 不会做您想做的事情,因为当这样:

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

调用你的 QEvent 已经被删除,所以waited_events 将永远是空的。

如果您需要MyQWidget 来使用这种方法,您必须创建一个新事件(如 F. Osterfeld 建议的那样)。我不是 100% 确定,但看起来你只是想抓住QEvent::KeyPress。如果是这种情况,那么简单的方法是让MyQWidget 覆盖void QWidget::keyPressEvent(QKeyEvent* event)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2020-02-22
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多