我已经覆盖了列表视图中的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文档并没有对此做太多说明。任何想法..。
发布于 2012-09-24 22:15:57
它不会崩溃,因为你没有使用事件循环。但我认为你应该这样做,原因有两个:
mousePressEvent()。因此,对于“自然的”鼠标按下事件和模拟的鼠标按下事件,应用程序的行为将有所不同。你可能会忘记这是为什么,当你的代码演变时,你可能会莫名其妙地崩溃。connect()到你从重写的鼠标事件处理器发出的信号。如果你遇到一个死锁,不要感到惊讶。这种半生不熟的快捷方式只能作为临时解决方案。从长远来看,他们会在你背后开枪。如果你真的想要一个快捷方式,那就停止假装这是一个鼠标事件,实现一个特殊的独立方法,这个方法也将从“真正的”鼠标事件中调用。如果你想要一个真正的鼠标事件,处理得当,创建一个动态的QMouseEvent,并在事件循环中将其排队。
QMouseEvent* evt = new QMouseEvent(QEvent::MouseButtonPress,
rect.center(),this->mapToGlobal(rect.center()),
Qt::LeftButton, Qt::LeftButton);
QCoreApplication::postEvent(this,evt);发布于 2012-09-24 21:46:07
事件处理程序并不拥有它们接收的事件的所有权。所以你当前的代码是很好的。
如果您将其传递给QCoreApplication::postEvent以异步发送,它将被自动删除(并导致崩溃)。
https://stackoverflow.com/questions/12560750
复制相似问题