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

如何在点击按钮时从QTableView中获取选中的QRadioButton

如何在点击按钮时获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:09:23