Python. Несколько отмеченных радио-кнопок единовременно
Я назначил каждому пользователю 2 радио-кнопки: вкл - выкл, но в данной реализации на всю таблицу может быть отмечена только 1 кнопка.
Другими словами я не могу 2 раза отметить выкл у 2-х разных пользователей.
Как мне это сделать?
class Main(QTableWidget):
def __init__(self):
super().__init__()
self.initUI()
def closeEvent(self, event): # Override standard method
reply = QMessageBox.question(self, 'Подтвердите действие', "Вы уверены, что хотите выйти",
QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) # Last param - focus
event.accept() if reply == QMessageBox.Yes else event.ignore()
def center(self): # Is it working?
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def button_сlick(self):
sender = self.sender()
print(sender.text() + ' was pressed')
pass
def initUI(self):
self.center()
self.setGeometry(100, 100, 280, 280)
self.setWindowTitle('Таблица пользователей')
self.resizeColumnsToContents() # adjust row by content
# self.setWindowIcon(QIcon('web.png'))
self.setColumnCount(len(row_labels))
self.setRowCount(len(users))
for y, user in enumerate(users):
btn_on = QRadioButton('вкл')
btn_off = QRadioButton('выкл')
button_group = QButtonGroup()
button_group.addButton(btn_on)
button_group.addButton(btn_off)
btn_on.clicked.connect(self.button_сlick)
btn_off.clicked.connect(self.button_сlick)
self.setItem(y, 0, QTableWidgetItem(user['mail']))
self.setItem(y, 1, QTableWidgetItem(user['online']))
self.setItem(y, 2, QTableWidgetItem(user['warning']))
self.setItem(y, 3, QTableWidgetItem(user['usd']))
self.setItem(y, 4, QTableWidgetItem(user['rub']))
self.setItem(y, 5, QTableWidgetItem(user['eur']))
self.setItem(y, 6, QTableWidgetItem(user['full_name']))
self.setItem(y, 8, self.setCellWidget(y, 8, btn_on)) # can remove setItem
self.setItem(y, 9, self.setCellWidget(y, 9, btn_off))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
m = Main()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
То что вы предоставили - не является воспроизводимым примером! Мне пришлось потратить какое-то время, чтобы запустить ваш код и это НЕ ПРАВИЛЬНО!
import sys
from PyQt5.Qt import *
class Main(QTableWidget):
def __init__(self):
super().__init__()
self.initUI()
def closeEvent(self, event):
reply = QMessageBox.question(
self,
'Подтвердите действие',
"Вы уверены, что хотите выйти",
QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes
)
event.accept() if reply == QMessageBox.Yes else event.ignore()
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def button_сlick(self):
sender = self.sender()
print(sender.text() + ' was pressed')
pass
def initUI(self):
self.center()
self.setGeometry(100, 100, 280, 280)
self.setWindowTitle('Таблица пользователей')
self.resizeColumnsToContents()
#??? row_labels ??? users
row_labels = ['row_labels 1', 'row_labels 2', 'row_labels 3', 'row_labels 4', ]
users = [{
'mail': 'users 1',
'online': 'users 2',
'warning': 'users 3',
'usd': 'users 4',
'rub': 'users 5',
'eur': 'users 6',
'full_name': 'users 7'
},
{'mail': 'users 11', 'online': 'users 21', 'warning': 'users 31', 'usd': 'users 41',
'rub': 'users 51', 'eur': 'users 61', 'full_name': 'users 71'},
{'mail': 'users 1', 'online': 'users 2', 'warning': 'users 3', 'usd': 'users 4',
'rub': 'users 52', 'eur': 'users 6', 'full_name': 'users 72'},
{'mail': 'users 1', 'online': 'users 2', 'warning': 'users 3', 'usd': 'users 4',
'rub': 'users 53', 'eur': 'users 6', 'full_name': 'users 73'},
]
self.setColumnCount(10) #(len(row_labels) -> row_labels ???)
self.setRowCount(len(users))
for y, user in enumerate(users):
btn_on = QRadioButton('вкл')
btn_off = QRadioButton('выкл')
groupbox_1 = QGroupBox()
h1_layout = QHBoxLayout(groupbox_1)
h1_layout.addWidget(btn_on)
h1_layout.addWidget(btn_off)
button_group = QButtonGroup(self)
button_group.addButton(btn_on)
button_group.addButton(btn_off)
button_group.buttonClicked['int'].connect(
lambda _id, row=y: self.buttonGroupClicked(_id, row)
)
self.setItem(y, 0, QTableWidgetItem(user['mail']))
self.setItem(y, 1, QTableWidgetItem(user['online']))
self.setItem(y, 2, QTableWidgetItem(user['warning']))
self.setItem(y, 3, QTableWidgetItem(user['usd']))
self.setItem(y, 4, QTableWidgetItem(user['rub']))
self.setItem(y, 5, QTableWidgetItem(user['eur']))
self.setItem(y, 6, QTableWidgetItem(user['full_name']))
# self.setItem(y, 8, self.setCellWidget(y, 8, btn_on)) # can remove setItem
# self.setItem(y, 9, self.setCellWidget(y, 9, btn_off))
self.setItem(y, 8, self.setCellWidget(y, 8, groupbox_1))
self.setRowHeight(y, 40)
self.setColumnWidth(8, 150)
def buttonGroupClicked(self, _id, row):
print(f'{self.sender().button(_id).text()} в строке {row}')
if __name__ == '__main__':
app = QApplication(sys.argv)
m = Main()
m.show()
sys.exit(app.exec_())
Автор решения: David Shiko
→ Ссылка
Я понял ошибку!
QButtonGroup() Должен наследоваться от созданного класса, а не импортируемоего!
Замените
button_group = QButtonGroup()наbutton_group = QButtonGroup(self)Удалите строчку
button_group.setExclusive(False)
Весь код: (Не все импорты нужны)
import sys
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QWidget, QPushButton, QRadioButton, \
QButtonGroup, QMessageBox, QDesktopWidget, QHBoxLayout, QGroupBox
row_labels = ["Логин", "Статус", "Уведомления", "USD", "EUR", "RUB", "ФИО", "Режим", "ВКЛ", "ВЫКЛ"]
row_tooltips = ["Е-мэйл пользователя. Пример: bessgmail.com",
"Баланс пользователя. Пример: 29 552,78",
"Баланс пользователя. Пример: 29 552,78",
"Баланс пользователя. Пример: 29 552,78",
"Количесвто уведомлений у пользователя. Пример: 2",
"Статус пользователя, активен или выключен. Пример: выключено",
"ФИО пользователя, пример: Веселова Галина Анатольевна",
"ФИО пользователя, пример: Веселова Галина Анатольевна",
"Режим, в котором запущен скрипт (с графикой или без). Пример: No_GUI",
"Режим, в котором запущен скрипт (с графикой или без). Пример: No_GUI"
]
users = [{
'mail': 'users 1',
'online': 'users 2',
'warning': 'users 3',
'usd': 'users 4',
'rub': 'users 5',
'eur': 'users 6',
'full_name': 'users 7'
},
{'mail': 'users 11', 'online': 'users 21', 'warning': 'users 31', 'usd': 'users 41',
'rub': 'users 51', 'eur': 'users 61', 'full_name': 'users 71'},
{'mail': 'users 1', 'online': 'users 2', 'warning': 'users 3', 'usd': 'users 4',
'rub': 'users 52', 'eur': 'users 6', 'full_name': 'users 72'},
{'mail': 'users 1', 'online': 'users 2', 'warning': 'users 3', 'usd': 'users 4',
'rub': 'users 53', 'eur': 'users 6', 'full_name': 'users 73'},
]
class Main(QTableWidget):
def __init__(self):
super().__init__()
self.initUI()
def closeEvent(self, event): # Override standard method
reply = QMessageBox.question(self, 'Подтвердите действие', "Вы уверены, что хотите выйти",
QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) # Last param - focus
event.accept() if reply == QMessageBox.Yes else event.ignore()
def center(self): # Is it working?
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def button_сlick(self):
sender = self.sender()
print(sender.text() + ' was pressed')
pass
pass
def run_user(self):
sender = self.sender()
print(sender.text() + ' was pressed')
def initUI(self):
self.center()
self.setGeometry(100, 100, 280, 280)
self.setWindowTitle('Таблица пользователей')
self.resizeColumnsToContents() # adjust row by content
self.setColumnCount(len(row_labels))
self.setRowCount(len(users))
self.setHorizontalHeaderLabels(row_labels)
for x, row in enumerate(row_labels):
self.horizontalHeaderItem(x).setToolTip(row_tooltips[x])
for y, user in enumerate(users):
btn_on = QRadioButton('вкл')
btn_off = QRadioButton('выкл')
button_group = QButtonGroup(self)
button_group.addButton(btn_on)
button_group.addButton(btn_off)
btn_on.clicked.connect(self.run_user)
btn_off.clicked.connect(self.run_user)
self.setItem(y, 0, QTableWidgetItem(user['mail']))
self.setItem(y, 1, QTableWidgetItem(user['online']))
self.setItem(y, 2, QTableWidgetItem(user['warning']))
self.setItem(y, 3, QTableWidgetItem(user['usd']))
self.setItem(y, 4, QTableWidgetItem(user['rub']))
self.setItem(y, 5, QTableWidgetItem(user['eur']))
self.setItem(y, 6, QTableWidgetItem(user['full_name']))
self.setItem(y, 8, self.setCellWidget(y, 8, btn_on)) # can remove setItem
self.setItem(y, 9, self.setCellWidget(y, 9, btn_off)))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
m = Main()
sys.exit(app.exec_())

