You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6中tableView.selectedIndexes列表索引越界问题排查

解决PySide6中delete_current_transaction的列表索引越界问题

问题根源分析

  1. 按钮连接逻辑错误:在MoneyManager类的__init__方法中,删除按钮的连接代码写成了self.ui.DeleteTransButton.clicked.connect(self.delete_current_transaction())——这里错误地直接调用了函数(加了括号),导致程序启动时就立即执行delete_current_transaction,此时用户还未选中任何行,selectedIndexes()返回空列表,访问索引[0]自然触发越界错误。而编辑功能的触发逻辑是先打开窗口,再在窗口内绑定按钮点击事件,只有用户主动操作时才会执行函数,此时通常已选中目标行,因此未暴露问题。

  2. 缺少选中状态校验:编辑和删除函数都没有先检查是否存在选中行,一旦用户未选中任何记录就触发操作,同样会触发索引越界。

修正后的代码

主应用类修正

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:07:51