Python PyQt5 QTablewidget项目对齐

Python PyQt5 QTablewidget项目对齐,python,pyqt,Python,Pyqt,我想要的是对齐Qtablewidget中的复选框。 下面是我的脚本 mylist = [some list I made..] for i in range(len(mylist)) : row_count = self.tableWidget.rowCount() nowset = row_count+1 self.tableWidget.setRowCount(nowset) self.tableWidget.setItem( row_count, 0, QT

我想要的是对齐Qtablewidget中的复选框。 下面是我的脚本

mylist = [some list I made..]
for i in range(len(mylist)) :
    row_count = self.tableWidget.rowCount()
    nowset = row_count+1
    self.tableWidget.setRowCount(nowset)
    self.tableWidget.setItem( row_count, 0, QTableWidgetItem(mylist[i]))
    chkBoxItem = QTableWidgetItem()
    chkBoxItem.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
    chkBoxItem.setCheckState(QtCore.Qt.Unchecked)
    self.tableWidget.setItem( i, 1, chkBoxItem)

self.tableWidget.setFocusPolicy(False)
self.tableWidget.setColumnWidth(1, 150)
self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
这是问题1。如何将我的QtableWidget项(即chekbox)与中心对齐

通过谷歌搜索,我发现cellwidget确实有效。所以 我尝试将代码更改为cellWidget而不是Item。 差不多

self.checkBoxList= []
for i in range(len(mylist)):
    ckbox = QCheckBox()
    self.checkBoxList.append(ckbox)

for i in range(len(mylist)):              
    cellWidget = QWidget()
    layoutCB = QHBoxLayout(cellWidget)
    layoutCB.addWidget(self.checkBoxList[i])
    layoutCB.setAlignment(QtCore.Qt.AlignCenter)            
    layoutCB.setContentsMargins(0,0,0,0)
    cellWidget.setLayout(layoutCB)
    self.tableWidget.setCellWidget(i,1,cellWidget)       
这是我需要的对齐复选框。但要解决其他问题

问题2。使用cellwidget,如何将所有chekbox cellwidget设置为选中

问题3。使用cellwidget,我如何知道检查了哪一行

问题4。使用cellwidget,如何更改单元格颜色

似乎item和cellwidget的工作方式不同

因为我有一个按钮,可以将所有复选框更改为选中和

另一个按钮,用于获取选中同一行复选框的第0列文本

我也试过这样做

class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(AlignDelegate, self).initStyleOption(option, index)
        option.displayAlignment = QtCore.Qt.AlignCenter
并将下面的代码置于self.tableWidget.setFocusPolicyFalse上方

不知道为什么。但是不起作用。 问题5。为什么不起作用

这是我的程序截图

如果你能解决问题1。那对我来说就足够了

因为其他的答案会让我改变下面所有的代码


其他的问题只是告诉我我试过了,他们制造了更多的问题

如果要将复选框居中,则必须使用QProxyStyle:

从PyQt5导入QtCore、QtGui、QtWidgets 类CheckBoxStyleQtWidgets.QProxyStyle: def subElementRectself、元素、选项、小部件=无: r=super.subelement矩形元素、选项、小部件 如果元素==QtWidgets.QStyle.SE_ItemViewItemCheckIndicator: r、 moveCenteroption.rect.center 返回r 类MainWindowQtWidgets.QMainWindow: def u_init__self,父项=无: 超级。初始父级 数据=[1,2,3,4,5,6] self.tableWidget=QtWidgets.QTableWidget0,2 self.setCentralWidgetself.tableWidget 对于数据中的文本: 行=self.tableWidget.rowCount self.tableWidget.insertRowrow text\u item=QtWidgets.QTableWidgetItemtext 复选框_item=QtWidgets.QTableWidgetItem 复选框\u item.setFlags QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled 复选框\u item.setCheckStateQtCore.Qt.Unchecked self.tableWidget.setItemrow,0,文本项 self.tableWidget.setItemrow,1,复选框\u项 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 导入系统 app=qtwidts.QApplicationsys.argv checkbox\u style=CheckBoxStyleapp.style app.setStylecheckbox\u样式 w=主窗口 w、 展示 sys.exitapp.exec_
如果要将复选框居中,则必须使用QProxyStyle:

从PyQt5导入QtCore、QtGui、QtWidgets 类CheckBoxStyleQtWidgets.QProxyStyle: def subElementRectself、元素、选项、小部件=无: r=super.subelement矩形元素、选项、小部件 如果元素==QtWidgets.QStyle.SE_ItemViewItemCheckIndicator: r、 moveCenteroption.rect.center 返回r 类MainWindowQtWidgets.QMainWindow: def u_init__self,父项=无: 超级。初始父级 数据=[1,2,3,4,5,6] self.tableWidget=QtWidgets.QTableWidget0,2 self.setCentralWidgetself.tableWidget 对于数据中的文本: 行=self.tableWidget.rowCount self.tableWidget.insertRowrow text\u item=QtWidgets.QTableWidgetItemtext 复选框_item=QtWidgets.QTableWidgetItem 复选框\u item.setFlags QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled 复选框\u item.setCheckStateQtCore.Qt.Unchecked self.tableWidget.setItemrow,0,文本项 self.tableWidget.setItemrow,1,复选框\u项 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 导入系统 app=qtwidts.QApplicationsys.argv checkbox\u style=CheckBoxStyleapp.style app.setStylecheckbox\u样式 w=主窗口 w、 展示 sys.exitapp.exec_
delegate = AlignDelegate(self.tableWidget)
self.tableWidget.setItemDelegateForColumn(1, delegate)