强制 QWidget 结束事件传播

Posted

技术标签:

【中文标题】强制 QWidget 结束事件传播【英文标题】:Force A QWidget to End Event Propagation 【发布时间】:2013-05-20 22:41:22 【问题描述】:

我将QLineEdit 附加到QGraphicsScene 的子类。我注意到QGraphicsScene 也获得了任何鼠标事件(例如鼠标按下、鼠标释放、鼠标移动等)对我附加的QLineEdit 的依赖。有什么办法可以防止事件通过QLineEdit进入现场?

我使用:

scene->addWidget(lineEdit);

有什么建议吗?谢谢!

【问题讨论】:

【参考方案1】:

http://qt-project.org/doc/qt-4.8/qmouseevent.html#details

http://qt-project.org/doc/qt-4.8/qt.html#WidgetAttribute-enum

Qt::WA_NoMousePropagation

禁止将鼠标事件传播到小部件的父级。该属性默认禁用。

这里有更多特定于 QGraphicsScene 的信息:

http://qt-project.org/doc/qt-4.8/qgraphicsscene.html#event-handling-and-propagation

对于鼠标悬停效果,QGraphicsScene 调度悬停事件。如果一个项目接受悬停事件(参见 QGraphicsItem::acceptHoverEvents()),当鼠标进入它的区域时它会收到一个 GraphicsSceneHoverEnter 事件。随着鼠标继续在项目区域内移动,QGraphicsScene 将向它发送 GraphicsSceneHoverMove 事件。当鼠标离开item所在区域时,item会收到GraphicsSceneHoverLeave事件。

所有鼠标事件都传递给当前的鼠标抓取器项。如果一个项目接受鼠标事件(参见 QGraphicsItem::acceptedMouseButtons())并且它接收到鼠标按下,它就会成为场景的鼠标抓取器。在没有按下其他鼠标按钮时,它会一直保持鼠标抓取器的状态,直到它接收到鼠标释放。您可以调用 mouseGrabberItem() 来确定当前正在抓取鼠标的项目。

【讨论】:

感谢 phyatt,帮了大忙 我认为问题在于场景不断窃取焦点。我从来没有看到闪烁的文本光标。 qgraphicsscene 中的代理小部件有点奇怪。他们有点工作。过去我对它们做了一些处理,并且它们不会以与嵌套在普通 QWidget 中时相同的速度重绘。您还可以像鼠标事件一样监视有焦点的内容和焦点事件。祝你好运。 哇,刚刚发现一个新类:qt-project.org/doc/qt-4.8/qgraphicsscenemouseevent.html

以上是关于强制 QWidget 结束事件传播的主要内容,如果未能解决你的问题,请参考以下文章

强制 QObject 作为 QWidget 的父级有啥后果?

如何从 QWidget 中删除 QPalette

QWidget中结束QThread线程

QWidget 键盘事件 焦点(QApplication源码)

QWidget中如何实现mouseEnter和mouseLeave事件?

Qt绘图学习