PyQt5 QTablewidget 项目对齐

Shi*_*hul 2 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, 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)
Run Code Online (Sandbox Code Playgroud)

这是问题 1。如何将 chekbox 的 QtableWidget 项目对齐到中心。

通过一些谷歌搜索,我发现 cellwidget 确实有效。所以我尝试将代码更改为cellWidgetnot 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)       
Run Code Online (Sandbox Code Playgroud)

这是我需要的对齐复选框。但让其他事情成为问题。

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

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

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

看起来itemcellwidget工作方式都不同。

因为我有按钮可以将所有复选框更改为选中状态

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

我也尝试过这样的委托。

class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(AlignDelegate, self).initStyleOption(option, index)
        option.displayAlignment = QtCore.Qt.AlignCenter
Run Code Online (Sandbox Code Playgroud)

并将以下代码放在上面self.tableWidget.setFocusPolicy(False)

delegate = AlignDelegate(self.tableWidget)
self.tableWidget.setItemDelegateForColumn(1, delegate)
Run Code Online (Sandbox Code Playgroud)

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

这是我的程序的屏幕截图。

在此输入图像描述

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

因为其他答案会让我更改以下所有代码。

其他问题只是告诉我尝试过,但它们会带来更多问题。

eyl*_*esc 5

如果你想让复选框居中,那么你必须使用 QProxyStyle:

from PyQt5 import QtCore, QtGui, QtWidgets


class CheckBoxStyle(QtWidgets.QProxyStyle):
    def subElementRect(self, element, option, widget=None):
        r = super().subElementRect(element, option, widget)
        if element == QtWidgets.QStyle.SE_ItemViewItemCheckIndicator:
            r.moveCenter(option.rect.center())
        return r


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        data = ["1", "2", "3", "4", "5", "6"]

        self.tableWidget = QtWidgets.QTableWidget(0, 2)
        self.setCentralWidget(self.tableWidget)

        for text in data:
            row = self.tableWidget.rowCount()
            self.tableWidget.insertRow(row)

            text_item = QtWidgets.QTableWidgetItem(text)

            checkbox_item = QtWidgets.QTableWidgetItem()
            checkbox_item.setFlags(
                QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
            )
            checkbox_item.setCheckState(QtCore.Qt.Unchecked)

            self.tableWidget.setItem(row, 0, text_item)
            self.tableWidget.setItem(row, 1, checkbox_item)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    checkbox_style = CheckBoxStyle(app.style())
    app.setStyle(checkbox_style)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述