0

我已经contentsMousePressEvent像这样覆盖了我的列表视图中的。

void AppListView::contentsMousePressEvent(QMouseEvent *e)
{
    AppGenericListView::contentsMousePressEvent(e);
    if (e->button() == Qt::RightButton)
        emit rightClicked();
    emit multiSelection();
}

这是我的keyPressEvent

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 doc对此并没有多说。有任何想法吗 ....

4

2 回答 2

1

事件处理程序不拥有他们收到的事件的所有权。所以你当前的代码很好。

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

于 2012-09-24T13:46:07.027 回答
1

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

  1. 您正在模拟鼠标按下事件,但您并未将其提供给对象。例如,您不会将假鼠标事件提供给mousePressEvent(). 因此,对于“自然”鼠标按下事件和您的模拟事件,应用程序的行为会有所不同。而且您可能会忘记为什么会这样,并且当您的代码发展时,您可能会遇到莫名其妙的崩溃。

  2. 处理鼠标按下事件将阻止原始系统按键事件处理。您无法知道谁(哪个线程)将对connect()您从覆盖的鼠标事件处理程序发出的信号进行处理。如果您遇到僵局,请不要感到惊讶。

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

QMouseEvent* evt = new QMouseEvent(QEvent::MouseButtonPress,
  rect.center(),this->mapToGlobal(rect.center()),
 Qt::LeftButton, Qt::LeftButton);
QCoreApplication::postEvent(this,evt);
于 2012-09-24T14:15:56.740 回答