在 PyQt5
中,可以通过绑定每个网格位置组件的 鼠标事件
来实现
举一个例子,就是我现在有6个标签,以网格布局方式排布,如下:
我想实现效图为:点击1得到他在网格布局中的位置(0,0),点击2得到(0,1),点击4得到(1,0),如果要得到顺序位置也很简单。
实现步骤:
分别为每个QLabel绑定鼠标点击事件
for label in self.findChildren(QLabel):
label.mouseDoubleClickEvent = lambda event: self.setLabelEvent(event)
其中 for label in self.findChildren(QLabel):
是获取当前窗口的所有QLabel组件,起到过滤的作用,之后遍历每个 QLabel
组件,为他们绑定鼠标双击事件。
之后就可以使用如下代码来获取当前的 QLabel
在网格布局中的 行与列
的信息
# 获取点击位置
position = self.widget.layout().indexOf(clickedLabel)
row, column, _, _ = self.widget.layout().getItemPosition(position)
代码如下:
class Window(QMainWindow, Ui_MainWindow):
def __init__(self):
super(Window, self).__init__()
# 设置主界面的UI
self.setupUi(self)
# 连接信号与槽
self.signal()
# 连接信号与槽函数
def signal(self):
for label in self.findChildren(QLabel):
label.mouseDoubleClickEvent = lambda event: self.setLabelEvent(event)
def setLabelEvent(self, event):
# 判断是否是按下了左键
if event.button() == QtCore.Qt.LeftButton:
# 获取鼠标点击的组件
widget = QtWidgets.QApplication.widgetAt(event.globalPos())
# 控件是 QLabel 类型
clickedLabel = widget
# 获取点击位置
position = self.widget.layout().indexOf(clickedLabel)
row, column, _, _ = self.widget.layout().getItemPosition(position)
self.label_7.setText(f"您点击了 ({
row}, {
column})")