from PyQt5.QtCore import QEvent, QRect, QSize from PyQt5.QtWidgets import QLabel, QPushButton, QFrame from widget.embed_detail import EmbedDetail class EmbedItem(QFrame): def __init__(self, parent=None): super(EmbedItem, self).__init__(parent) self.rect = None self.param = None self.item_button = QPushButton(self) self.item_button.clicked.connect(self.click) self.item_label = QLabel(self) def resizeEvent(self, event: QEvent): super().resizeEvent(event) button_size = self.item_button.size() label_size = self.item_label.sizeHint() self.setFixedSize(max(button_size.width(), label_size.width()), button_size.height() + label_size.height() +2) widget_size = self.size() if label_size.width() > button_size.width(): self.item_button.move((widget_size.width() - button_size.width()) / 2, 0) self.item_label.move(0, button_size.height() + 2) self.move(self.rect.x() - (widget_size.width() - button_size.width()) / 2, self.rect.y()) else: self.item_label.move((widget_size.width() - label_size.width()) / 2, button_size.height() + 2) self.item_button.move(0, 0) self.move(self.rect.x(), self.rect.y()) def setItemParam(self, param): self.param = param self.rect = QRect(int(param["x"]), int(param["y"]), int(param["w"]), int(param["h"])) self.item_button.setFixedSize(QSize(int(param["w"]), int(param["h"]))) self.item_button.setObjectName(param["code"]) self.item_label.setText(param["code"]) self.item_label.move(0, self.rect.height() + 5) def setIndex(self, index): self.item_button.setText(index) def setChecked(self): self.item_button.setStyleSheet("border: 1px solid #6cff6c;") def setError(self): self.item_button.setStyleSheet("border: 1px solid #FF4444;") def click(self): if self.item_button.text() is None or self.item_button.text() == "": return detail = EmbedDetail() detail.setInfo(self.param) relative_pos = self.item_button.pos() global_pos = self.mapToGlobal(relative_pos) detail.move(global_pos.x() + self.item_button.width() + 2, global_pos.y() + 2) detail.exec_()