如何获取选中的行 QtableWidget

问题描述

我有这个代码。我想删除点击删除按钮时勾选处于活动状态的任何行

from main import Ui_MainWindow
from PyQt5 import QtWidgets
from  PyQt5.QtCore import Qt

def set_cell_elements(rows,l):
    ui.tableWidget.setRowCount(len(rows))
    ui.tableWidget.setVerticalHeaderLabels(rows)
    ui.tableWidget.verticalHeader().setDefaultAlignment(Qt.AlignVCenter)
    ui.tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)

    for r in range(0,len(l)):
        for i in range (0,len(l[r])) :
            text = l[r][i]
            ui.tableWidget.setItem(r,i,QtWidgets.QTableWidgetItem(str(text)))
            ui.tableWidget.item(r,i).setTextAlignment(Qt.AlignCenter)
            item = ui.tableWidget.item(r,0)
            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            item.setCheckState(Qt.Unchecked)
            item.checkState()
            table_ = ui.tableWidget.horizontalHeader()
            table_.setSectionResizeMode(i,QtWidgets.QHeaderView.ResizetoContents)

def delete_button():
    pass

import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
#=====================
rows = ['a','b','c','d','e','f']
l = [['Wade','Wade','Seth','Ivan','Riley'],['Gilbert','Jorge','Dan','Brian','Roberto'],['Ramon','Liam','Miles','Nathaniel','Lewis'],['Ethan','Milton','Joshua','Claude','Glen'],['Harvey','Blake','Antonio','Connor','Julian'],['Aidan','Harold','Conner','Peter','Hunter']]

set_cell_elements(rows,l)
ui.delete_button.clicked.connect(delete_button)
MainWindow.show()
sys.exit(app.exec_())

我没有办法获取勾选处于活动状态的行,你能帮我吗!?请

解决方法

欢迎使用 StackOverflow!您的问题中缺少一些信息,可以帮助您解决问题。我只能猜测你的代码缺失的部分。

我猜您已经使用 Qt Designer 以图形方式创建了您的 UI。我会假设你的 UI 看起来像这样:

Image representation of the guessed UI

编译后给出:

main.py

​​>
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Ui_MainWindow.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore,QtGui,QtWidgets


class Ui_MainWindow(object):
    def setupUi(self,MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800,600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(19,16,761,521))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
        self.verticalLayout.setContentsMargins(0,0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.delete_button = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.delete_button.setObjectName("delete_button")
        self.verticalLayout.addWidget(self.delete_button)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.tableWidget = QtWidgets.QTableWidget(self.verticalLayoutWidget)
        self.tableWidget.setBaseSize(QtCore.QSize(0,0))
        self.tableWidget.setRowCount(6)
        self.tableWidget.setColumnCount(5)
        self.tableWidget.setObjectName("tableWidget")
        self.verticalLayout_2.addWidget(self.tableWidget)
        self.verticalLayout.addLayout(self.verticalLayout_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0,800,24))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self,MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow","MainWindow"))
        self.delete_button.setText(_translate("MainWindow","Delete selected rows"))

最小更改解决方案是:

解决方案1.py

​​>
from main import Ui_MainWindow
from PyQt5 import QtWidgets
from  PyQt5.QtCore import Qt

def set_cell_elements(rows,l):
    ui.tableWidget.setRowCount(len(rows))
    ui.tableWidget.setVerticalHeaderLabels(rows)
    ui.tableWidget.verticalHeader().setDefaultAlignment(Qt.AlignVCenter)
    ui.tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)

    for r in range(0,len(l)):
        for i in range (0,len(l[r])) :
            text = l[r][i]
            ui.tableWidget.setItem(r,i,QtWidgets.QTableWidgetItem(str(text)))
            ui.tableWidget.item(r,i).setTextAlignment(Qt.AlignCenter)
            item = ui.tableWidget.item(r,0)
            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            item.setCheckState(Qt.Unchecked)
            item.checkState()
            table_ = ui.tableWidget.horizontalHeader()
            table_.setSectionResizeMode(i,QtWidgets.QHeaderView.ResizeToContents)

def delete_button():
    for r in range(ui.tableWidget.rowCount(),-1):
        item = ui.tableWidget.item(r - 1,0)
        if item.checkState() == Qt.Checked:
            ui.tableWidget.removeRow(r - 1)

import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
#=====================
rows = ['a','b','c','d','e','f']
l = [['Wade','Wade','Seth','Ivan','Riley'],['Gilbert','Jorge','Dan','Brian','Roberto'],['Ramon','Liam','Miles','Nathaniel','Lewis'],['Ethan','Milton','Joshua','Claude','Glen'],['Harvey','Blake','Antonio','Connor','Julian'],['Aidan','Harold','Conner','Peter','Hunter']]

set_cell_elements(rows,l)
ui.delete_button.clicked.connect(delete_button)
MainWindow.show()
sys.exit(app.exec_())


但是可以对您的代码进行更多清理和简化:

解决方案2.py

​​>
from main import Ui_MainWindow
from PyQt5 import QtWidgets

from PyQt5.QtCore import Qt

def set_cell_elements(row_headers,data_body):
    ui.tableWidget.setRowCount(len(row_headers))
    ui.tableWidget.setVerticalHeaderLabels(row_headers)
    ui.tableWidget.verticalHeader().setDefaultAlignment(Qt.AlignVCenter)
    ui.tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)

    for (row_number,current_row) in enumerate(data_body):
        for (column_number,current_text) in enumerate(current_row):
            ui.tableWidget.setItem(
                row_number,column_number,QtWidgets.QTableWidgetItem(str(current_text))
            )
            ui.tableWidget.item(row_number,column_number).setTextAlignment(Qt.AlignCenter)
            row_header = ui.tableWidget.horizontalHeader()
            row_header.setSectionResizeMode(column_number,QtWidgets.QHeaderView.ResizeToContents)
        item = ui.tableWidget.item(row_number,0)
        item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
        item.setCheckState(Qt.Unchecked)
 
def delete_button_action():    
    for current_row in range(ui.tableWidget.rowCount() - 1,-1,-1):
        first_item = ui.tableWidget.item(current_row,0)
        state_current_row = first_item.checkState()
        if state_current_row == Qt.Checked:
            ui.tableWidget.removeRow(current_row)
    
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)

row_headers = ('a','f')
data_body = (
    ('Wade','Riley'),('Gilbert','Roberto'),('Ethan','Glen'),('Ramon','Lewis'),('Harvey','Julian'),('Aidan','Hunter')
)

set_cell_elements(row_headers,data_body)
ui.delete_button.clicked.connect(delete_button_action)
MainWindow.show()
sys.exit(app.exec_())


但是您可以以更加面向对象的方式对其进行编码。这样,只要您提供包含的小部件及其初始数据,您就可以将其插入 UI 的任何位置,并且它会自行处理:

解决方案 3.py

​​>
import sys
from main import Ui_MainWindow
from PyQt5 import QtWidgets

from PyQt5.QtCore import Qt

class Simple_table_editor(Ui_MainWindow):

    def __init__(self,parent,row_headers,initial_data):
        super().__init__()
        self.setupUi(parent)
        self.tableWidget.setRowCount(len(row_headers))
        self.tableWidget.setVerticalHeaderLabels(row_headers)
        self.tableWidget.verticalHeader().setDefaultAlignment(Qt.AlignVCenter)
        self.tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)

        for (row_number,current_row) in enumerate(initial_data):
            for (column_number,current_text) in enumerate(current_row):
                self.tableWidget.setItem(
                    row_number,QtWidgets.QTableWidgetItem(str(current_text))
                )
                self.tableWidget.item(row_number,column_number).setTextAlignment(Qt.AlignCenter)
                row_header = self.tableWidget.horizontalHeader()
                row_header.setSectionResizeMode(column_number,QtWidgets.QHeaderView.ResizeToContents)
            item = self.tableWidget.item(row_number,0)
            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            item.setCheckState(Qt.Unchecked)
        
        self.delete_button.clicked.connect(self.delete_button_action)

    def delete_button_action(self):    
        for current_row in range(self.tableWidget.rowCount() - 1,-1):
            first_item = self.tableWidget.item(current_row,0)
            state_current_row = first_item.checkState()
            if state_current_row == Qt.Checked:
                self.tableWidget.removeRow(current_row)

row_headers = ('a','Hunter')
)

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
table_editor = Simple_table_editor(MainWindow,data_body)
MainWindow.show()
sys.exit(app.exec_())

如果我的猜测是错误的,而您打算做其他事情,请提供更多详细信息。