Как разместить кнопки внутри таблицы по центру

В текущей реализации, как и весь текст, кнопки прижимаются к лквому краю. Я хочу, чтобы они (кнопки вкл/выкл) были по центру. Я гуглил этот вопрос, но не понял ответы.

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_())

введите сюда описание изображения

→ Ссылка