Проблема в вашем случае в том, что выбранный QCheckBox должен иметь фокус, но вы его отключили, и в соответствии с тем, что вы утверждаете в своих комментариях, я думаю, что у вас проблема XY : Ваша нижняя проблема состоит в том, чтобы иметь выбор для каждой строки и включить изменение статуса флажка в зависимости от данных, которые имеет QTableWidget.
Учитывая вышеизложенное, нет необходимости использовать QCheckBox, достаточно обширный, чтобы включитьустановите флажок Qt :: ItemIsUserCheckable и используйте делегат, чтобы включить или отключить изменение состояния флажка.
Учитывая вышеизложенное, решение является следующим:
import random
from enum import Flag
from PyQt5 import QtCore, QtGui, QtWidgets
PermissionsRole = QtCore.Qt.UserRole + 1000
class Permissions(Flag):
User = 0
Admin = 1 << 0
class CheckBoxDelegate(QtWidgets.QStyledItemDelegate):
def editorEvent(self, event, model, option, index):
if index.data(PermissionsRole) & Permissions.Admin:
super(CheckBoxDelegate, self).editorEvent(
event, model, option, index
)
return False
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.m_tablewidget = QtWidgets.QTableWidget(
selectionBehavior=QtWidgets.QAbstractItemView.SelectRows,
selectionMode=QtWidgets.QAbstractItemView.SingleSelection,
editTriggers=QtWidgets.QAbstractItemView.NoEditTriggers,
showGrid=False,
columnCount=3,
)
delegate = CheckBoxDelegate(self.m_tablewidget)
self.m_tablewidget.setItemDelegateForColumn(1, delegate)
self.m_tablewidget.setStyleSheet(
"""
QTableView
{
background-color: white;
selection-background-color: #353535;
}
"""
)
for header in (
self.m_tablewidget.horizontalHeader(),
self.m_tablewidget.verticalHeader(),
):
header.hide()
if header.orientation() == QtCore.Qt.Horizontal:
header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
for i in range(10):
isAdmin = random.choice([Permissions.User, Permissions.Admin])
self.m_tablewidget.insertRow(self.m_tablewidget.rowCount())
self.m_tablewidget.setItem(
i,
0,
QtWidgets.QTableWidgetItem(
"Is Admin?: {}".format(isAdmin == Permissions.Admin)
),
)
it = QtWidgets.QTableWidgetItem()
it.setData(PermissionsRole, isAdmin)
it.setFlags(it.flags() | QtCore.Qt.ItemIsUserCheckable)
it.setCheckState(QtCore.Qt.Checked)
self.m_tablewidget.setItem(i, 1, it)
self.setCentralWidget(self.m_tablewidget)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())