强制 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 键盘事件 焦点(QApplication源码)