首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Qt中的keyPressEvent中手动生成QMouseEvent

在Qt中的keyPressEvent中手动生成QMouseEvent
EN

Stack Overflow用户
提问于 2012-09-24 15:40:50
回答 2查看 6.9K关注 0票数 0

我已经覆盖了列表视图中的contentsMousePressEvent,如下所示。

代码语言:javascript
复制
void AppListView::contentsMousePressEvent(QMouseEvent *e)
{
    AppGenericListView::contentsMousePressEvent(e);
    if (e->button() == Qt::RightButton)
        emit rightClicked();
    emit multiSelection();
}

这是我的keyPressEvent

代码语言:javascript
复制
void AppListView::keyPressEvent(QKeyEvent * e)
{
    AppGenericListView::keyPressEvent(e);
    if ((e->key() == Qt::Key_Up) || (e->key() == Qt::Key_Down))
    {
        QListViewItem * item = currentItem();
        if (item)
        {
            const QRect rect = itemRect(item);
            QMouseEvent mEvt(QEvent::MouseButtonPress, rect.center(), Qt::LeftButton, Qt::LeftButton);
            contentsMousePressEvent(&mEvt);
        }
    }
}

现在,这段代码运行得很好。请注意,我不是在创建动态QMouseEvent对象。我想知道的是,这会不会在将来导致崩溃?contentMousePressEvent需要动态对象吗?Qt文档并没有对此做太多说明。任何想法..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-24 22:15:57

它不会崩溃,因为你没有使用事件循环。但我认为你应该这样做,原因有两个:

  1. 您正在模拟鼠标按下事件,但您并没有将其作为对象提供给对象。例如,您不会将假鼠标事件提供给mousePressEvent()。因此,对于“自然的”鼠标按下事件和模拟的鼠标按下事件,应用程序的行为将有所不同。你可能会忘记这是为什么,当你的代码演变时,你可能会莫名其妙地崩溃。
  2. ,最初的系统按键事件处理将通过处理鼠标按下事件而被阻止。你不知道谁(哪个线程)会connect()到你从重写的鼠标事件处理器发出的信号。如果你遇到一个死锁,不要感到惊讶。

这种半生不熟的快捷方式只能作为临时解决方案。从长远来看,他们会在你背后开枪。如果你真的想要一个快捷方式,那就停止假装这是一个鼠标事件,实现一个特殊的独立方法,这个方法也将从“真正的”鼠标事件中调用。如果你想要一个真正的鼠标事件,处理得当,创建一个动态的QMouseEvent,并在事件循环中将其排队。

代码语言:javascript
复制
QMouseEvent* evt = new QMouseEvent(QEvent::MouseButtonPress,
  rect.center(),this->mapToGlobal(rect.center()),
 Qt::LeftButton, Qt::LeftButton);
QCoreApplication::postEvent(this,evt);
票数 1
EN

Stack Overflow用户

发布于 2012-09-24 21:46:07

事件处理程序并不拥有它们接收的事件的所有权。所以你当前的代码是很好的。

如果您将其传递给QCoreApplication::postEvent以异步发送,它将被自动删除(并导致崩溃)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12560750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档