如何在点击按钮时从QTableView中获取选中的QRadioButton
看起来你已经成功把QRadioButton嵌入到QTableView的第一列中,现在需要实现点击按钮时找到被选中的单选框,并获取对应行的CSV数据。下面是两种可行的实现方案,你可以根据需求选择:
方案一:使用QButtonGroup实现单选互斥并快速获取选中项
这种方法更高效,还能确保同一时间只有一个单选框被选中(符合常规单选逻辑):
import pandas as pd from PySide2.QtCore import Qt from PySide2.QtGui import QStandardItemModel, QStandardItem from PySide2.QtWidgets import (QApplication, QTableView, QRadioButton, QPushButton, QButtonGroup, QWidget, QVBoxLayout) app = QApplication([]) # 加载CSV数据(替换成你的实际文件路径) my_csv = "your_file_path.csv" df = pd.read_csv(my_csv, sep=';') # 创建UI组件 main_widget = QWidget() layout = QVBoxLayout(main_widget) my_button = QPushButton("获取选中行数据") model = QStandardItemModel() view = QTableView() view.setModel(model) # 设置表头 header = [''] + df.columns.tolist() model.setHorizontalHeaderLabels(header) # 创建按钮组管理所有单选框,实现互斥 radio_group = QButtonGroup() radio_group.setExclusive(True) # 填充表格数据 for row_idx in df.index: # 第一列添加单选框 radio_btn = QRadioButton() radio_group.addButton(radio_btn, row_idx) # 把行号绑定为按钮ID # 创建该行的其他数据项 data_items = [QStandardItem(str(field)) for field in df.iloc[row_idx]] for item in data_items: item.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter) # 添加行到模型并设置单选框 model.appendRow([QStandardItem()] + data_items) view.setIndexWidget(model.index(row_idx, 0), radio_btn) # 按钮点击槽函数 def on_get_selected_row(): selected_btn = radio_group.checkedButton() if selected_btn: row_idx = radio_group.id(selected_btn) selected_data = df.iloc[row_idx].to_dict() print("选中行的数据:", selected_data) # 这里可以根据需求处理数据,比如显示到界面或保存 my_button.clicked.connect(on_get_selected_row) # 组装布局并显示 layout.addWidget(view) layout.addWidget(my_button) main_widget.show() app.exec_()
关键点解释:
- 用
QButtonGroup管理所有单选框,通过setExclusive(True)确保同一时间只有一个选项被选中 - 添加按钮时绑定行号作为ID,选中时直接通过
radio_group.id(selected_btn)获取对应行索引,无需遍历所有行 - 点击按钮后快速定位选中项,高效获取对应行的CSV数据
方案二:遍历所有行检查单选框状态(无互斥逻辑)
如果你不需要单选互斥,允许多个单选框被选中,可以用这种方法:
import pandas as pd from PySide2.QtCore import Qt from PySide2.QtGui import QStandardItemModel, QStandardItem from PySide2.QtWidgets import (QApplication, QTableView, QRadioButton, QPushButton, QWidget, QVBoxLayout) app = QApplication([]) my_csv = "your_file_path.csv" df = pd.read_csv(my_csv, sep=';') main_widget = QWidget() layout = QVBoxLayout(main_widget) my_button = QPushButton("获取所有选中行数据") model = QStandardItemModel() view = QTableView() view.setModel(model) header = [''] + df.columns.tolist() model.setHorizontalHeaderLabels(header) # 保存所有单选框与行索引的映射(可选) radio_buttons = [] for row_idx in df.index: radio_btn = QRadioButton() radio_buttons.append((row_idx, radio_btn)) data_items = [QStandardItem(str(field)) for field in df.iloc[row_idx]] for item in data_items: item.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter) model.appendRow([QStandardItem()] + data_items) view.setIndexWidget(model.index(row_idx, 0), radio_btn) def on_get_selected_rows(): selected_data_list = [] # 方法1:遍历提前保存的单选框列表 for row_idx, btn in radio_buttons: if btn.isChecked(): selected_data_list.append(df.iloc[row_idx].to_dict()) # 方法2:直接从表格动态获取单元格widget(无需提前保存) # for row_idx in range(model.rowCount()): # btn = view.indexWidget(model.index(row_idx, 0)) # if btn and btn.isChecked(): # selected_data_list.append(df.iloc[row_idx].to_dict()) print("所有选中行的数据:", selected_data_list) my_button.clicked.connect(on_get_selected_rows) layout.addWidget(view) layout.addWidget(my_button) main_widget.show() app.exec_()
关键点解释:
- 两种方式获取选中项:要么提前保存单选框与行的映射,要么直接从表格中动态获取每个单元格的widget
- 遍历所有行,通过
isChecked()判断单选框状态,收集所有选中行的数据
额外提示:
你的原CSV示例格式需要修正为标准结构,比如:
ANIMAL;AGE DOG;3 CAT;5 COW;5
原代码中的df_interface.index应为df.index,已在示例中修正。
内容的提问来源于stack exchange,提问作者Arben John Avillanosa
相关产品推荐
相关产品推荐

