Как разместить кнопки внутри таблицы по центру
В текущей реализации, как и весь текст, кнопки прижимаются к лквому краю. Я хочу, чтобы они (кнопки вкл/выкл) были по центру. Я гуглил этот вопрос, но не понял ответы.
import sys
from PySide2 import QtCore
from main_updated_class import PP
import get_config
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 = ["Е-мэйл пользователя. Пример: [email protected]",
"Баланс пользователя. Пример: 29 552,78",
"Баланс пользователя. Пример: 29 552,78",
"Баланс пользователя. Пример: 29 552,78",
"Количесвто уведомлений у пользователя. Пример: 2",
"Статус пользователя, активен или выключен. Пример: выключено",
"ФИО пользователя, пример: Веселова Галина Анатольевна",
"ФИО пользователя, пример: Веселова Галина Анатольевна",
"Режим, в котором запущен скрипт (с графикой или без). Пример: No_GUI",
"Режим, в котором запущен скрипт (с графикой или без). Пример: No_GUI"
]
users = [{'mail': '[email protected]', 'pp_pass': '!', 'online': '1', 'warning': '0', 'usd': '0', 'rub': '0', 'eur': '0', 'full_name': 'Юрий'}, {'mail': '[email protected]', 'pp_pass': '!', 'online': '1', 'warning': '0', 'usd': '0', 'rub': '0', 'eur': '0', 'full_name': 'Владимир'}]
class Main(QTableWidget):
def __init__(self):
super().__init__()
self.init_ui()
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())
@staticmethod
def run_user(user_id):
print(users)
# pp = PP(email=users[user_id]['mail'])
@staticmethod
def stop_user(user_id):
# print(users[user_id]['mail'])
pp = PP(email=users[user_id]['mail'])
# print('email:', email)
def init_ui(self):
self.center()
self.setGeometry(100, 100, 280, 280)
self.setWindowTitle('Таблица пользователей')
self.resizeColumnsToContents() # adjust row by content
self.resizeRowsToContents() # ?
self.setWindowIcon(QIcon('index.jpeg'))
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('выкл')
btn_on.setStyleSheet("border: 1px solid green;")
btn_off.setStyleSheet("border: 1px solid red;")
btn_off.move(-500, -500)
button_group = QButtonGroup(self)
button_group.addButton(btn_on)
button_group.addButton(btn_off)
# Alternatively btn_on.email = user['mail']. _=None it is mystic, without it email = True
btn_on.clicked.connect(lambda _=None, user_id=y: self.run_user(user_id)) # user['mail'] --
btn_off.clicked.connect(lambda _=None, user_id=y: self.stop_user(user_id)) # -- Returns Last email
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_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант
import sys
'''
from PySide2 import QtCore
from main_updated_class import PP
import get_config
from PySide2.QtGui import QIcon
from PySide2.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QWidget, QPushButton, QRadioButton, \
QButtonGroup, QMessageBox, QDesktopWidget, QHBoxLayout, QGroupBox
'''
from PyQt5.Qt import *
row_labels = ["Логин", "Статус", "Уведомления", "USD", "EUR", "RUB", "ФИО", "Режим", "ВКЛ", "ВЫКЛ"]
row_tooltips = ["Е-мэйл пользователя. Пример: [email protected]",
"Баланс пользователя. Пример: 29 552,78",
"Баланс пользователя. Пример: 29 552,78",
"Баланс пользователя. Пример: 29 552,78",
"Количесвто уведомлений у пользователя. Пример: 2",
"Статус пользователя, активен или выключен. Пример: выключено",
"ФИО пользователя, пример: Веселова Галина Анатольевна",
"ФИО пользователя, пример: Веселова Галина Анатольевна",
"Режим, в котором запущен скрипт (с графикой или без). Пример: No_GUI",
"Режим, в котором запущен скрипт (с графикой или без). Пример: No_GUI"
]
users = [{'mail': '[email protected]', 'pp_pass': '!', 'online': '1', 'warning': '0', 'usd': '0', 'rub': '0', 'eur': '0', 'full_name': 'Юрий'}, {'mail': '[email protected]', 'pp_pass': '!', 'online': '1', 'warning': '0', 'usd': '0', 'rub': '0', 'eur': '0', 'full_name': 'Владимир'}]
class Main(QTableWidget):
def __init__(self):
super().__init__()
self.init_ui()
def closeEvent123(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())
@staticmethod
def run_user(user_id):
print(users)
# pp = PP(email=users[user_id]['mail'])
pass
@staticmethod
def stop_user(user_id):
# pp = PP(email=users[user_id]['mail'])
pass
def init_ui(self):
self.center()
self.setGeometry(100, 100, 280, 280)
self.setWindowTitle('Таблица пользователей')
self.resizeColumnsToContents() # adjust row by content
self.resizeRowsToContents() # ?
self.setWindowIcon(QIcon('index.jpeg'))
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):
# +++
w = QWidget() # +++
w.setStyleSheet("border: 1px solid green;") # +++
h_layout = QHBoxLayout(w) # +++
h_layout.setContentsMargins(0, 0, 0, 0) # +++
btn_on = QRadioButton('вкл')
h_layout.addWidget(btn_on, alignment=Qt.AlignCenter) # +++
btn_off = QRadioButton('выкл')
# btn_on.setStyleSheet("border: 1px solid green;") # ---
btn_on.setStyleSheet("border: none;") # +++
btn_off.setStyleSheet("border: 1px solid red;")
btn_off.move(-500, -500)
button_group = QButtonGroup(self)
button_group.addButton(btn_on)
button_group.addButton(btn_off)
# Alternatively btn_on.email = user['mail']. _=None it is mystic, without it email = True
btn_on.clicked.connect(lambda _=None, user_id=y: self.run_user(user_id)) # user['mail'] --
btn_off.clicked.connect(lambda _=None, user_id=y: self.stop_user(user_id)) # -- Returns Last email
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)) # ---
self.setItem(y, 8, self.setCellWidget(y, 8, w)) # +++
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_())

