【发布时间】:2016-06-21 00:01:02
【问题描述】:
背景
我正在用 PyQT5 编写一个简单的应用程序。主要的QWidget 是QGridLayout,视觉上的结果应该是这样的:
+-----------------------------------+
row1 | QLabelA | QLabelB | QLabelC |
+-----------------------------------+
row2 | QLabelA | QLabelB | QLabelC |
+-----------------------------------+
row3 | QLabelA | QLabelB | QLabelC |
+-----------------------------------+
...
这个QGridLayout 是使用循环填充的,每次迭代代表一行,所以我有这样的东西:
row = 0
self.grid = QGridLayout()
while row < 10:
filepath = 'icon.png'
icon = QImage(filepath)
QLabelA = QLabel()
QLabelA.setPixmap(QPixmap.fromImage(icon))
QLabelB = QLabel()
QLabelB.setPixmap(QPixmap.fromImage(icon))
QLabelC = QLabel()
QLabelC.setPixmap(QPixmap.fromImage(icon))
self.grid.addWidget(QLabelA, row, 0)
self.grid.addWidget(QLabelB, row, 1)
self.grid.addWidget(QLabelC, row, 2)
row += 1
到目前为止,这工作得很好。
问题
我的目标是让每个QLabels(在视觉上是图像)都有一个关联的操作,在用户简单地点击每个操作后应该触发该操作。为此,我发现a property 允许在单击对象后调用方法,所以我可以简单地这样做:
QLabelA.mousePressedEvent = this.do_something
def do_something(self, event):
...
第一个问题很容易看出:我需要一种方法来识别QLabels 中的哪一个被点击(即,哪一行)。为此,我找到了一种将自定义参数添加到mousePressedEvent 的方法。让我们关注QLabelA 字段,它会在点击时调用clicked() 方法:
QLabelA.mousePressEvent = lambda x: self.clicked(row)
def clicked(self, row):
print row
大问题来了:这些QLabelA 字段中的每一个都依赖于row 变量,并且它们不是在创建时进行评估,而是在点击时进行评估。因此,如果用户在第 0 行单击 QLabelA,则在 clicked() 方法内,row 将具有最后一个 row 值(即,QGridLayout 的行数)而不是在定义时有。如果self.grid 有 5 行,则用户点击的位置无关紧要,row 的值始终为 5。
我尝试通过定义一个包含 row 值的列表来解决此限制,但它没有任何区别,因为它仍然依赖于点击时的 row 值。
问题
有没有办法让这项工作按预期工作,并在创建时而不是点击时分配传递给 click() 方法的值?也欢迎任何不同的方法或方式来实现这一点。
【问题讨论】:
标签: python python-2.7 pyqt pyqt5