使整个 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)