gpt4 book ai didi

qt - 获取光标下的所有小部件

转载 作者:行者123 更新时间:2023-12-01 20:04:46 24 4
gpt4 key购买 nike

widgetAt 函数为我提供了位于光标正下方、处于最高 z 顺序的小部件。

pos = QtGui.QCursor.pos()
widget = QtGui.qApp.widgetAt(pos)

但是我怎样才能获得光标下的所有小部件呢?包括最上面那个后面的人吗?像这样的东西:

pos = QtGui.QCursor.pos()
widgets = QtGui.qApp.widgetsAt(pos)

示例

作为使用示例,想象一个叠加层,该叠加层在用户单击的任何位置添加动画图形,例如水面上的波纹。当然,覆盖层需要接收并响应点击,但它必须在不干扰传播到其下方小部件的点击的情况下这样做。

另一个例子是使用情况跟踪;要拦截并记录点击以进行分析,可以使用相同的覆盖层,但这次不绘制任何内容,仅收集。

在这两种情况下,如果只有一个小部件获取点击事件,我需要一种方法来区分哪些小部件位于其下方,以便传递事件。

最佳答案

这是另一种可能的解决方案,多次调用现有的QApplication.widgetAt

import sys
from PySide import QtGui, QtCore


def widgets_at(pos):
"""Return ALL widgets at `pos`

Arguments:
pos (QPoint): Position at which to get widgets

"""

widgets = []
widget_at = QtGui.qApp.widgetAt(pos)

while widget_at:
widgets.append(widget_at)

# Make widget invisible to further enquiries
widget_at.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
widget_at = QtGui.qApp.widgetAt(pos)

# Restore attribute
for widget in widgets:
widget.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, False)

return widgets

示例

image

class Overlay(QtGui.QWidget):
def __init__(self, parent=None):
super(Overlay, self).__init__(parent)
self.setAttribute(QtCore.Qt.WA_StyledBackground)
self.setStyleSheet("QWidget { background-color: rgba(0, 255, 0, 50) }")

def mousePressEvent(self, event):
pos = QtGui.QCursor.pos()
print [w.objectName() for w in widgets_at(pos)]
return super(Overlay, self).mousePressEvent(event)


app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window.setObjectName("Window")
window.setFixedSize(200, 100)

button = QtGui.QPushButton("Button 1", window)
button.setObjectName("Button 1")
button.move(10, 10)
button = QtGui.QPushButton("Button 2", window)
button.setObjectName("Button 2")
button.move(50, 15)
overlay = Overlay(window)
overlay.setObjectName("Overlay")
overlay.setFixedSize(window.size())

window.show()
app.exec_()

这是一些输出。

[u'Overlay', u'Window'] # Clicking an empty area
[u'Overlay', u'Button 1', u'Window'] # Button 1
[u'Overlay', u'Button 2', u'Window'] # Button 2
[u'Overlay', u'Button 2', u'Button 1', u'Window'] # Overlap

看起来结果是 O(1),还有一个额外的好处是按照重叠的顺序返回每个小部件。但是,当重叠窗口的属性发生更改和恢复时,它确实会导致重叠窗口闪烁 (Windows 8)。

关于qt - 获取光标下的所有小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27363267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com