Как отделить группы QRadioButton для разных таблиц
Сам вопрос взял своё начало здесь: выделение строк по клику на строку и саму кнопку.
Образовалась в дальнейшем проблема при попытке увеличить количество таблиц (до 3
и более) - при нажатии по строке на любой таблице, видимо, из-за общедоступного self.row_selected
и общей для всех таблиц self.button_group
, объявленных в конструкторе и методе соответственно, выделение также меняется и в последней, куда вставлялись radioButton
. (Стоит отметить, что при клике на саму кнопку в любой из таблиц всё работает верно, как планируется и при клике на строку).
Я пытался менять глобальные переменные, делать self.cell_row
анонимной(лямбда-ф-ией) и передавать в неё флаги (из какой таблицы вызывается метод) - это всё не увенчалось успехом.
Как всё-таки обойти это и заставить работать клик по строке любой из таблиц так же, как клик по кнопке любой из таблиц?
Первые 2 скрина - клики по кнопкам таблицы (сохраняется выделение и отмеченные кнопки).
Последний скрин - клики по строкам всех таблиц, кроме последней (меняются выделения, и отмечается rb
только в последней таблице)
main.py
import sys
from PyQt5 import QtWidgets, QtCore
from ui import untitled
class MainWindow(QtWidgets.QMainWindow, untitled.Ui_Form):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.tableWidget.cellClicked.connect(self.cell_row)
self.tableWidget_2.cellClicked.connect(self.cell_row)
self.tableWidget_3.cellClicked.connect(self.cell_row)
self.row_selected = None
'''self.button_group1 = None
self.row_selected2 = None
self.button_group2 = None'''
self.insert_rb(self.tableWidget)
self.insert_rb(self.tableWidget_2)
self.insert_rb(self.tableWidget_3)
def create_radioButton(self):
widget = QtWidgets.QWidget()
rb = QtWidgets.QRadioButton()
pLayout = QtWidgets.QHBoxLayout(widget)
pLayout.addWidget(rb)
pLayout.setAlignment(QtCore.Qt.AlignCenter)
pLayout.setContentsMargins(0, 0, 0, 0)
widget.setLayout(pLayout)
return widget, rb
def cell_row(self, row, column):
print(f'\n row={row}; column={column}')
self.row_selected = row
rb = self.button_group.button(row)
rb.click()
def insert_rb(self, table):
row_count = table.rowCount()
self.button_group = QtWidgets.QButtonGroup(self)
self.button_group.setExclusive(True)
for i in range(row_count):
widget, radio = self.create_radioButton()
radio.toggled.connect(lambda ch, row=i: self.currentPos(ch, row, table))
table.setCellWidget(i, 0, widget)
self.button_group.addButton(radio)
self.button_group.setId(radio, i)
def currentPos(self, ch, row, table):
# print(f' row = {row} -- {ch}')
if ch:
self.row_selected = row
table.selectRow(row)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
untitled.py (конвертировал из .ui в .py)
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(844, 506)
self.tableWidget = QtWidgets.QTableWidget(Form)
self.tableWidget.setGeometry(QtCore.QRect(240, 10, 321, 151))
self.tableWidget.setStyleSheet("QTableWidget::item:hover {\n"
" color: white;\n"
" background-color: red;\n"
"} \n"
"\n"
"QTableWidget::item:selected\n"
"{\n"
" color: white;\n"
" background-color: green;\n"
" \n"
"}\n"
"")
self.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.tableWidget.setShowGrid(True)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(3)
self.tableWidget.setRowCount(2)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 2, item)
self.tableWidget_2 = QtWidgets.QTableWidget(Form)
self.tableWidget_2.setGeometry(QtCore.QRect(240, 180, 321, 151))
self.tableWidget_2.setStyleSheet("QTableWidget::item:hover {\n"
" color: white;\n"
" background-color: red;\n"
"} \n"
"\n"
"QTableWidget::item:selected\n"
"{\n"
" color: white;\n"
" background-color: green;\n"
" \n"
"}\n"
"")
self.tableWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.tableWidget_2.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.tableWidget_2.setShowGrid(True)
self.tableWidget_2.setObjectName("tableWidget_2")
self.tableWidget_2.setColumnCount(3)
self.tableWidget_2.setRowCount(2)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setItem(0, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setItem(0, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setItem(0, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setItem(1, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setItem(1, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_2.setItem(1, 2, item)
self.tableWidget_3 = QtWidgets.QTableWidget(Form)
self.tableWidget_3.setGeometry(QtCore.QRect(240, 350, 321, 151))
self.tableWidget_3.setStyleSheet("QTableWidget::item:hover {\n"
" color: white;\n"
" background-color: red;\n"
"} \n"
"\n"
"QTableWidget::item:selected\n"
"{\n"
" color: white;\n"
" background-color: green;\n"
" \n"
"}\n"
"")
self.tableWidget_3.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.tableWidget_3.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.tableWidget_3.setShowGrid(True)
self.tableWidget_3.setObjectName("tableWidget_3")
self.tableWidget_3.setColumnCount(3)
self.tableWidget_3.setRowCount(2)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setItem(0, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setItem(0, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setItem(0, 2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setItem(1, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setItem(1, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setItem(1, 2, item)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.tableWidget.setSortingEnabled(True)
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("Form", "1"))
item = self.tableWidget.verticalHeaderItem(1)
item.setText(_translate("Form", "2"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("Form", "0"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Form", "1"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("Form", "2"))
__sortingEnabled = self.tableWidget.isSortingEnabled()
self.tableWidget.setSortingEnabled(False)
item = self.tableWidget.item(0, 1)
item.setText(_translate("Form", "sssss"))
item = self.tableWidget.item(0, 2)
item.setText(_translate("Form", "xxxxxxx"))
item = self.tableWidget.item(1, 1)
item.setText(_translate("Form", "ttttt"))
item = self.tableWidget.item(1, 2)
item.setText(_translate("Form", "jjjjjj"))
self.tableWidget.setSortingEnabled(__sortingEnabled)
self.tableWidget_2.setSortingEnabled(True)
item = self.tableWidget_2.verticalHeaderItem(0)
item.setText(_translate("Form", "1"))
item = self.tableWidget_2.verticalHeaderItem(1)
item.setText(_translate("Form", "2"))
item = self.tableWidget_2.horizontalHeaderItem(0)
item.setText(_translate("Form", "New Column"))
item = self.tableWidget_2.horizontalHeaderItem(1)
item.setText(_translate("Form", "1"))
item = self.tableWidget_2.horizontalHeaderItem(2)
item.setText(_translate("Form", "2"))
__sortingEnabled = self.tableWidget_2.isSortingEnabled()
self.tableWidget_2.setSortingEnabled(False)
item = self.tableWidget_2.item(0, 1)
item.setText(_translate("Form", "1111"))
item = self.tableWidget_2.item(0, 2)
item.setText(_translate("Form", "2222"))
item = self.tableWidget_2.item(1, 1)
item.setText(_translate("Form", "33333"))
item = self.tableWidget_2.item(1, 2)
item.setText(_translate("Form", "44444"))
self.tableWidget_2.setSortingEnabled(__sortingEnabled)
self.tableWidget_3.setSortingEnabled(True)
item = self.tableWidget_3.verticalHeaderItem(0)
item.setText(_translate("Form", "1"))
item = self.tableWidget_3.verticalHeaderItem(1)
item.setText(_translate("Form", "2"))
item = self.tableWidget_3.horizontalHeaderItem(0)
item.setText(_translate("Form", "0"))
item = self.tableWidget_3.horizontalHeaderItem(1)
item.setText(_translate("Form", "1"))
item = self.tableWidget_3.horizontalHeaderItem(2)
item.setText(_translate("Form", "2"))
__sortingEnabled = self.tableWidget_3.isSortingEnabled()
self.tableWidget_3.setSortingEnabled(False)
item = self.tableWidget_3.item(0, 1)
item.setText(_translate("Form", "text1"))
item = self.tableWidget_3.item(0, 2)
item.setText(_translate("Form", "num1"))
item = self.tableWidget_3.item(1, 1)
item.setText(_translate("Form", "text2"))
item = self.tableWidget_3.item(1, 2)
item.setText(_translate("Form", "num2"))
self.tableWidget_3.setSortingEnabled(__sortingEnabled)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())