From f3465fc623dff77a92e4fe6890b629473f07f783 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 23 Feb 2025 21:35:34 +0800 Subject: [PATCH] =?UTF-8?q?[bugfix]=20=E4=BF=AE=E5=A4=8Dcard=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/widget_card.cpython-313.pyc | Bin 30148 -> 32265 bytes component/widget_card/widget_card.py | 168 +++++++++++------- 2 files changed, 108 insertions(+), 60 deletions(-) diff --git a/component/widget_card/__pycache__/widget_card.cpython-313.pyc b/component/widget_card/__pycache__/widget_card.cpython-313.pyc index 2ff3a213c8e04ecf32e94b1a3a4e08213700ba98..16b22506482617f38178484578204bb1a6031b09 100644 GIT binary patch delta 4492 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 0 and self.editing_param_index < len(data.params): - editor = QLineEdit(parent) + editor = QLineEdit(parent) + editor.setStyleSheet(""" + QLineEdit { + background-color: #2C2C2C; + color: white; + border: 1px solid #346792; + border-radius: 4px; + padding: 2px; + } + """) + + if self.editing_field == 'name': + editor.setText(data.name) + elif self.editing_field == 'description': + editor.setText(data.description) + elif self.editing_param_index >= 0 and self.editing_param_index < len(data.params): editor.setText(data.params[self.editing_param_index].name) - editor.setStyleSheet(""" - QLineEdit { - background-color: #2C2C2C; - color: white; - border: 1px solid #346792; - border-radius: 4px; - padding: 2px; - } - """) - return editor - return None + + return editor def updateEditorGeometry(self, editor, option, index): - if self.editing_param_index >= 0: + if self.editing_field in ['name', 'description']: + editor.setGeometry(self.edit_rect) + elif self.editing_param_index >= 0: params_rect = self.getParamsRect(option.rect) param_height = 24 spacing = 4 @@ -385,18 +388,32 @@ class CardItemDelegate(QStyledItemDelegate): editor.setGeometry(editor_rect) def setEditorData(self, editor, index): - if isinstance(editor, QLineEdit): - data = index.data(Qt.ItemDataRole.UserRole) - if self.editing_param_index >= 0 and self.editing_param_index < len(data.params): - editor.setText(data.params[self.editing_param_index].name) + if not isinstance(editor, QLineEdit): + return + + data = index.data(Qt.ItemDataRole.UserRole) + if self.editing_field == 'name': + editor.setText(data.name) + elif self.editing_field == 'description': + editor.setText(data.description) + elif self.editing_param_index >= 0: + editor.setText(data.params[self.editing_param_index].name) def setModelData(self, editor, model, index): - if isinstance(editor, QLineEdit): - data = index.data(Qt.ItemDataRole.UserRole) - if self.editing_param_index >= 0 and self.editing_param_index < len(data.params): - data.params[self.editing_param_index].name = editor.text() - model.setData(index, data, Qt.ItemDataRole.UserRole) - self.editing_param_index = -1 + if not isinstance(editor, QLineEdit): + return + + data = index.data(Qt.ItemDataRole.UserRole) + if self.editing_field == 'name': + data.name = editor.text() + elif self.editing_field == 'description': + data.description = editor.text() + elif self.editing_param_index >= 0: + data.params[self.editing_param_index].name = editor.text() + + model.setData(index, data, Qt.ItemDataRole.UserRole) + self.editing_field = None + self.editing_param_index = -1 def paint(self, painter, option, index): if not index.isValid(): @@ -518,6 +535,37 @@ class CardItemDelegate(QStyledItemDelegate): painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, param.name) painter.restore() + def getParamIndex(self, pos, rect): + """根据点击位置获取参数索引""" + if not rect.contains(pos): + return -1 + + param_height = 24 + spacing = 4 + indent = 20 + + # 计算点击位置对应的参数索引 + relative_y = pos.y() - rect.top() + index = relative_y // (param_height + spacing) + + # 确保索引在有效范围内 + if 0 <= index < len(self.parent().currentItem().data(Qt.ItemDataRole.UserRole).params): + return index + return -1 + + def getParamRect(self, index, rect): + """获取指定参数索引的矩形区域""" + param_height = 24 + spacing = 4 + indent = 20 + + return QRect( + rect.left() + indent, + rect.top() + index * (param_height + spacing), + rect.width() - indent, + param_height + ) + if __name__ == '__main__': app = QApplication(sys.argv)