PySide6中tableView.selectedIndexes列表索引越界问题排查
解决PySide6中delete_current_transaction的列表索引越界问题
问题根源分析
按钮连接逻辑错误:在
MoneyManager类的__init__方法中,删除按钮的连接代码写成了self.ui.DeleteTransButton.clicked.connect(self.delete_current_transaction())——这里错误地直接调用了函数(加了括号),导致程序启动时就立即执行delete_current_transaction,此时用户还未选中任何行,selectedIndexes()返回空列表,访问索引[0]自然触发越界错误。而编辑功能的触发逻辑是先打开窗口,再在窗口内绑定按钮点击事件,只有用户主动操作时才会执行函数,此时通常已选中目标行,因此未暴露问题。缺少选中状态校验:编辑和删除函数都没有先检查是否存在选中行,一旦用户未选中任何记录就触发操作,同样会触发索引越界。
修正后的代码
主应用类修正
class MoneyManager(QMainWindow): def __init__(self): super(MoneyManager, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUI(self) self.conn = Data() self.view_data() self.ui.NewTransButton.clicked.connect(self.open_new_transaction_window) self.ui.EditTransButton.clicked.connect(self.open_new_transaction_window) # 修正:传递函数对象,不要加括号调用 self.ui.DeleteTransButton.clicked.connect(self.delete_current_transaction) def open_new_transaction_window(self): self.new_window = QtWidgets.QDialog() self.ui_window = Ui_New_Transaction_window() self.ui_window.setupUi(self.new_window) self.new_window.show() sender = self.sender() if sender.text() == "New transaction": # 修正:信号连接用clicked.connect而非clicked.connection self.ui_window.NewTransButton.clicked.connect(self.add_new_transaction) else: # 修正:信号连接用clicked.connect而非clicked.connection self.ui_window.EditTransButton.clicked.connect(self.edit_current_transaction)
编辑与删除函数修正
def edit_current_transaction(self): # 先校验是否有选中行 selected_indexes = self.ui.tableView.selectedIndexes() if not selected_indexes: # 可添加用户提示,比如弹出QMessageBox告知未选中记录 return index = selected_indexes[0] id = str(self.ui.tableView.model().data(index)) date = self.ui_window.dataEdit.text() category = self.ui_window.cb_chose_category.currentText() description = self.ui_window.le.description.text() balance = self.ui_window.le_balance.text() status = self.ui_window.cb_status.currentText() self.conn.update_transaction_query(date, category, description, balance, status, id) self.view_data() self.new_window.close() def delete_current_transaction(self): # 先校验是否有选中行 selected_indexes = self.ui.tableView.selectedIndexes() if not selected_indexes: # 可添加用户提示,比如弹出QMessageBox告知未选中记录 return index = selected_indexes[0] id = str(self.ui.tableView.model().data(index)) self.conn.delete_transaction_query(id) self.view_data() # 修正:判断窗口是否存在且可见,避免无窗口时触发错误 if hasattr(self, 'new_window') and self.new_window.isVisible(): self.new_window.close()
额外说明
- 代码中还有两处拼写错误:
clicked.connection是错误写法,PySide6中信号连接的正确语法是clicked.connect。 - 删除函数中关闭
new_window的逻辑需要增加判断,因为删除操作可能直接在主窗口触发,并未打开编辑窗口,避免出现属性不存在的错误。
内容的提问来源于stack exchange,提问作者1lt3rra
相关产品推荐
相关产品推荐

