You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
3.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
基础按钮委托类
提供通用的按钮索引获取和数据访问方法
"""
from PyQt5.QtWidgets import QItemDelegate, QMessageBox
from PyQt5.QtCore import Qt
class BaseButtonDelegate(QItemDelegate):
"""基础按钮委托类,提供通用的索引处理方法"""
def __init__(self, parent=None):
super(BaseButtonDelegate, self).__init__(parent)
def _get_button_row_indices(self, button):
"""
获取按钮所在的视图行和源模型行索引
返回: (view_row, source_row) (None, None) 如果找不到
"""
table_view = self.parent()
# 获取操作列索引(最后一列)
if hasattr(table_view, 'proxy') and table_view.proxy:
operation_col = table_view.proxy.columnCount() - 1
row_count = table_view.proxy.rowCount()
else:
operation_col = table_view.model.columnCount() - 1
row_count = table_view.model.rowCount()
# 查找按钮所在的行
for row in range(row_count):
if hasattr(table_view, 'proxy') and table_view.proxy:
index = table_view.proxy.index(row, operation_col)
else:
index = table_view.model.index(row, operation_col)
widget = table_view.indexWidget(index)
if widget and widget.layout():
for i in range(widget.layout().count()):
if widget.layout().itemAt(i).widget() == button:
view_row = row
# 转换为源模型索引
if hasattr(table_view, 'proxy') and table_view.proxy:
proxy_index = table_view.proxy.index(view_row, 0)
source_index = table_view.proxy.mapToSource(proxy_index)
source_row = source_index.row()
else:
source_row = view_row
return view_row, source_row
return None, None
def _get_view_data(self, view_row, column):
"""
从视图中获取指定行列的数据
"""
table_view = self.parent()
if hasattr(table_view, 'proxy') and table_view.proxy:
index = table_view.proxy.index(view_row, column)
return table_view.proxy.data(index, Qt.DisplayRole)
else:
return table_view.model.datas[view_row][column]
def _validate_button_indices(self, button):
"""
验证并获取按钮索引如果失败则显示错误消息
返回: (view_row, source_row) (None, None)
"""
view_row, source_row = self._get_button_row_indices(button)
if view_row is None:
QMessageBox.warning(self.parent(), '错误', '无法确定按钮所在行', QMessageBox.Yes)
return None, None
return view_row, source_row