使整个 gridLayout Widget 可点击
Make the whole gridLayoutWidget clickable
我有以下代码,它显示了我的应用程序历史 window 中的 7 个小部件。每个小部件都有一个名称、图标和一个指向先前打开的文件的地址。我希望所有的小部件都是可点击的,并编写一个函数来准确知道哪个小部件被点击了。我不知道如何使整个小部件充当单个可点击项目。
这是我用于显示小部件的代码。
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
for i in range (7):
self.gridLayoutWidget = QWidget(self)
self.gridLayoutWidget.setGeometry(QRect(40, 40 + i * 60, 350, 40))
self.gridLayout = QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.Label1 = QLabel(self.gridLayoutWidget)
self.Label1.setText("the name of the file")
self.Label1.setFont(QFont('Arial', 14))
self.gridLayout.addWidget(self.Label1, 0, 1, 1, 9)
self.Label2 = QLabel(self.gridLayoutWidget)
self.Label2.setText("the address of the file")
self.gridLayout.addWidget(self.Label2, 1, 1, 1, 9)
self.im = QPixmap("img.ico")
self.icon = QLabel()
self.icon.setPixmap(self.im)
self.gridLayout.addWidget(self.icon , 0, 0, 2, 1)
在这种情况下,最好创建一个class继承自widget并实现复杂widget的逻辑,以避免可能导致问题的重复代码(例如self.Label2 QLabel指的是什么? 它指的是第一个,第二个,...?,因为它指的是后者)。另一方面,这允许我们覆盖 mouseReleaseEvent 方法,导致发出信号,稍后允许我们使用 sender 方法识别小部件。
class GridLayoutWidget(QWidget):
clicked = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.Label1 = QLabel(text="the name of the file", font=QFont("Arial", 14))
self.Label2 = QLabel(text="the address of the file")
self.icon = QLabel(pixmap=QPixmap("img.ico"))
self.gridLayout = QGridLayout(self)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.addWidget(self.Label1, 0, 1, 1, 9)
self.gridLayout.addWidget(self.Label2, 1, 1, 1, 9)
self.gridLayout.addWidget(self.icon, 0, 0, 2, 1)
def mouseReleaseEvent(self, event):
super().mouseReleaseEvent(event)
self.clicked.emit()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
rect = QRect(40, 40, 350, 40)
for i in range(7):
widget = GridLayoutWidget(self)
widget.setGeometry(rect.translated(0, 60 * i))
widget.clicked.connect(self.handle_clicked)
self.resize(640, 480)
@pyqtSlot()
def handle_clicked(self):
widget = self.sender()
print(widget)
我有以下代码,它显示了我的应用程序历史 window 中的 7 个小部件。每个小部件都有一个名称、图标和一个指向先前打开的文件的地址。我希望所有的小部件都是可点击的,并编写一个函数来准确知道哪个小部件被点击了。我不知道如何使整个小部件充当单个可点击项目。 这是我用于显示小部件的代码。
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
for i in range (7):
self.gridLayoutWidget = QWidget(self)
self.gridLayoutWidget.setGeometry(QRect(40, 40 + i * 60, 350, 40))
self.gridLayout = QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.Label1 = QLabel(self.gridLayoutWidget)
self.Label1.setText("the name of the file")
self.Label1.setFont(QFont('Arial', 14))
self.gridLayout.addWidget(self.Label1, 0, 1, 1, 9)
self.Label2 = QLabel(self.gridLayoutWidget)
self.Label2.setText("the address of the file")
self.gridLayout.addWidget(self.Label2, 1, 1, 1, 9)
self.im = QPixmap("img.ico")
self.icon = QLabel()
self.icon.setPixmap(self.im)
self.gridLayout.addWidget(self.icon , 0, 0, 2, 1)
在这种情况下,最好创建一个class继承自widget并实现复杂widget的逻辑,以避免可能导致问题的重复代码(例如self.Label2 QLabel指的是什么? 它指的是第一个,第二个,...?,因为它指的是后者)。另一方面,这允许我们覆盖 mouseReleaseEvent 方法,导致发出信号,稍后允许我们使用 sender 方法识别小部件。
class GridLayoutWidget(QWidget):
clicked = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.Label1 = QLabel(text="the name of the file", font=QFont("Arial", 14))
self.Label2 = QLabel(text="the address of the file")
self.icon = QLabel(pixmap=QPixmap("img.ico"))
self.gridLayout = QGridLayout(self)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.addWidget(self.Label1, 0, 1, 1, 9)
self.gridLayout.addWidget(self.Label2, 1, 1, 1, 9)
self.gridLayout.addWidget(self.icon, 0, 0, 2, 1)
def mouseReleaseEvent(self, event):
super().mouseReleaseEvent(event)
self.clicked.emit()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
rect = QRect(40, 40, 350, 40)
for i in range(7):
widget = GridLayoutWidget(self)
widget.setGeometry(rect.translated(0, 60 * i))
widget.clicked.connect(self.handle_clicked)
self.resize(640, 480)
@pyqtSlot()
def handle_clicked(self):
widget = self.sender()
print(widget)