Pyside:检测 QWidget 上的单击和双击

gho*_*654 2 python user-interface mouseevent pyside

我正在 Maya 中构建一个 UI,当单击按钮时将生成一堆水平布局,其中包含QScrollArea. 我想弄清楚如何让每一行识别单击/双击。当单击特定行时,我希望它返回被单击的小部件,以便我可以用它做一些事情。我想我可能必须将容器小部件附加到行布局才能识别鼠标点击?

我已经弄清楚了一般如何识别单击和双击并让它打印一些东西 - 但我很难弄清楚如何将它链接到一个小部件。

ekh*_*oro 6

下面是一个演示,它应该可以做你想做的大部分事情。关键方法是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)

  • @ghost654。使用字典听起来完全合理。再说一次,因为你已经有了这个小部件,我想你也可以发出一个自定义的 `rowClicked` 信号来发送被点击的小部件,然后在连接的插槽中设置背景。 (2认同)