gho*_*654 2 python user-interface mouseevent pyside
我正在 Maya 中构建一个 UI,当单击按钮时将生成一堆水平布局,其中包含QScrollArea. 我想弄清楚如何让每一行识别单击/双击。当单击特定行时,我希望它返回被单击的小部件,以便我可以用它做一些事情。我想我可能必须将容器小部件附加到行布局才能识别鼠标点击?
我已经弄清楚了一般如何识别单击和双击并让它打印一些东西 - 但我很难弄清楚如何将它链接到一个小部件。
下面是一个演示,它应该可以做你想做的大部分事情。关键方法是childAt,它在给定点获取子小部件。显然,要使其工作,所有目标小部件必须是处理事件的小部件的后代。该lastpos检查用于检测真正的点击事件(即同一小部件上的鼠标按下和释放)。
import sys
from PySide import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.scroll = QtGui.QScrollArea()
self.scroll.setWidgetResizable(True)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.scroll)
widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout(widget)
for text in 'red green yellow purple orange blue'.split():
item = QtGui.QFrame()
item.setObjectName(text)
item.setStyleSheet('background-color: %s' % text)
layout.addWidget(item)
self.scroll.setWidget(widget)
self._lastpos = None
def mousePressEvent(self, event):
self._lastpos = event.pos()
def mouseReleaseEvent(self, event):
widget = self.childAt(event.pos())
if (widget is not None and self._lastpos is not None and
widget is self.childAt(self._lastpos)):
if widget.objectName():
print('click:', widget.objectName())
self._lastpos = None
def mouseDoubleClickEvent(self, event):
widget = self.childAt(event.pos())
if widget is not None and widget.objectName():
print('dblclick:', widget.objectName())
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 300, 400)
window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)