[bugfix] 修复card显示异常问题
This commit is contained in:
parent
6b0aeed713
commit
f3465fc623
Binary file not shown.
@ -296,48 +296,44 @@ class CardItemDelegate(QStyledItemDelegate):
|
|||||||
self.edit_mode = False
|
self.edit_mode = False
|
||||||
self.edit_rect = QRect()
|
self.edit_rect = QRect()
|
||||||
self.editing_param_index = -1
|
self.editing_param_index = -1
|
||||||
self.selected_param_index = -1 # 添加选中参数的索引跟踪
|
self.selected_param_index = -1
|
||||||
|
self.editing_field = None # 添加字段标识:'name', 'description' 或 None
|
||||||
|
|
||||||
def editorEvent(self, event, model, option, index):
|
def editorEvent(self, event, model, option, index):
|
||||||
data = index.data(Qt.ItemDataRole.UserRole)
|
data = index.data(Qt.ItemDataRole.UserRole)
|
||||||
if not data or not data.params:
|
if not data:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
params_rect = self.getParamsRect(option.rect)
|
|
||||||
pos = event.pos()
|
pos = event.pos()
|
||||||
|
|
||||||
# 计算参数项的位置
|
# 检查是否点击在标题或描述区域
|
||||||
param_height = 24
|
title_rect = self.getTitleRect(option.rect)
|
||||||
spacing = 4
|
desc_rect = self.getDescriptionRect(option.rect)
|
||||||
indent = 20
|
|
||||||
|
if event.type() == QEvent.MouseButtonDblClick:
|
||||||
|
if title_rect.contains(pos):
|
||||||
|
self.editing_field = 'name'
|
||||||
|
self.edit_rect = title_rect
|
||||||
|
self.parent().edit(index)
|
||||||
|
return True
|
||||||
|
elif desc_rect.contains(pos):
|
||||||
|
self.editing_field = 'description'
|
||||||
|
self.edit_rect = desc_rect
|
||||||
|
self.parent().edit(index)
|
||||||
|
return True
|
||||||
|
|
||||||
# 检查是否点击在参数区域内
|
# 检查是否点击在参数区域内
|
||||||
for i, param in enumerate(data.params):
|
params_rect = self.getParamsRect(option.rect)
|
||||||
param_rect = QRect(
|
if params_rect.contains(pos):
|
||||||
params_rect.left() + indent,
|
|
||||||
params_rect.top() + i * (param_height + spacing),
|
|
||||||
params_rect.width() - indent,
|
|
||||||
param_height
|
|
||||||
)
|
|
||||||
|
|
||||||
# 创建实际的点击检测区域(考虑滚动位置)
|
|
||||||
actual_rect = QRect(
|
|
||||||
param_rect.left(),
|
|
||||||
param_rect.top(),
|
|
||||||
param_rect.width(),
|
|
||||||
param_rect.height()
|
|
||||||
)
|
|
||||||
|
|
||||||
if actual_rect.contains(pos):
|
|
||||||
if event.type() == QEvent.MouseButtonPress:
|
if event.type() == QEvent.MouseButtonPress:
|
||||||
# 单击选中
|
# 单击选中
|
||||||
self.selected_param_index = i
|
self.selected_param_index = self.getParamIndex(pos, params_rect)
|
||||||
self.parent().viewport().update()
|
self.parent().viewport().update()
|
||||||
return True
|
return True
|
||||||
elif event.type() == QEvent.MouseButtonDblClick:
|
elif event.type() == QEvent.MouseButtonDblClick:
|
||||||
# 双击编辑
|
# 双击编辑
|
||||||
self.editing_param_index = i
|
self.editing_param_index = self.getParamIndex(pos, params_rect)
|
||||||
self.edit_rect = actual_rect
|
self.edit_rect = self.getParamRect(self.selected_param_index, params_rect)
|
||||||
self.parent().edit(index)
|
self.parent().edit(index)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -353,9 +349,7 @@ class CardItemDelegate(QStyledItemDelegate):
|
|||||||
if not data:
|
if not data:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if self.editing_param_index >= 0 and self.editing_param_index < len(data.params):
|
|
||||||
editor = QLineEdit(parent)
|
editor = QLineEdit(parent)
|
||||||
editor.setText(data.params[self.editing_param_index].name)
|
|
||||||
editor.setStyleSheet("""
|
editor.setStyleSheet("""
|
||||||
QLineEdit {
|
QLineEdit {
|
||||||
background-color: #2C2C2C;
|
background-color: #2C2C2C;
|
||||||
@ -365,11 +359,20 @@ class CardItemDelegate(QStyledItemDelegate):
|
|||||||
padding: 2px;
|
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)
|
||||||
|
|
||||||
return editor
|
return editor
|
||||||
return None
|
|
||||||
|
|
||||||
def updateEditorGeometry(self, editor, option, index):
|
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)
|
params_rect = self.getParamsRect(option.rect)
|
||||||
param_height = 24
|
param_height = 24
|
||||||
spacing = 4
|
spacing = 4
|
||||||
@ -385,17 +388,31 @@ class CardItemDelegate(QStyledItemDelegate):
|
|||||||
editor.setGeometry(editor_rect)
|
editor.setGeometry(editor_rect)
|
||||||
|
|
||||||
def setEditorData(self, editor, index):
|
def setEditorData(self, editor, index):
|
||||||
if isinstance(editor, QLineEdit):
|
if not isinstance(editor, QLineEdit):
|
||||||
|
return
|
||||||
|
|
||||||
data = index.data(Qt.ItemDataRole.UserRole)
|
data = index.data(Qt.ItemDataRole.UserRole)
|
||||||
if self.editing_param_index >= 0 and self.editing_param_index < len(data.params):
|
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)
|
editor.setText(data.params[self.editing_param_index].name)
|
||||||
|
|
||||||
def setModelData(self, editor, model, index):
|
def setModelData(self, editor, model, index):
|
||||||
if isinstance(editor, QLineEdit):
|
if not isinstance(editor, QLineEdit):
|
||||||
|
return
|
||||||
|
|
||||||
data = index.data(Qt.ItemDataRole.UserRole)
|
data = index.data(Qt.ItemDataRole.UserRole)
|
||||||
if self.editing_param_index >= 0 and self.editing_param_index < len(data.params):
|
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()
|
data.params[self.editing_param_index].name = editor.text()
|
||||||
|
|
||||||
model.setData(index, data, Qt.ItemDataRole.UserRole)
|
model.setData(index, data, Qt.ItemDataRole.UserRole)
|
||||||
|
self.editing_field = None
|
||||||
self.editing_param_index = -1
|
self.editing_param_index = -1
|
||||||
|
|
||||||
def paint(self, painter, option, index):
|
def paint(self, painter, option, index):
|
||||||
@ -518,6 +535,37 @@ class CardItemDelegate(QStyledItemDelegate):
|
|||||||
painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, param.name)
|
painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, param.name)
|
||||||
painter.restore()
|
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__':
|
if __name__ == '__main__':
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user