有啥办法可以延迟 Qt QEvent?

Posted

技术标签:

【中文标题】有啥办法可以延迟 Qt QEvent?【英文标题】: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,但您可以编写一个函数来克隆您可能感兴趣的事件。 【参考方案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)

【讨论】:

以上是关于有啥办法可以延迟 Qt QEvent?的主要内容,如果未能解决你的问题,请参考以下文章

QT里面有啥办法可以实现悬浮按钮?? 我在弄个相册。 几个控制按钮悬在图片上边。 普通的

Qt 子界面打开速度很慢,有啥办法能显著提高速度?

quartus里用原理图的方法进行仿真时,为啥输出比输入延迟了一个时钟周期,有啥解决的办法吗?

为啥页面加载总是很慢?有啥办法可以解决?

有啥方法可以通过 Qt Designer 添加 QSystemTrayIcon

unity的平行光有啥办法可以只照射一些区域