有啥办法可以延迟 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里面有啥办法可以实现悬浮按钮?? 我在弄个相册。 几个控制按钮悬在图片上边。 普通的
quartus里用原理图的方法进行仿真时,为啥输出比输入延迟了一个时钟周期,有啥解决的办法吗?