PySide/PyQt4:向QTableWidget水平(列)标题添加一个复选框

Kar*_*sov 5 python pyqt4 pyside

我试图在tablewidget的水平(列)标题中放置一个复选框.基于此处的其他帖子(因为基础对象类型相同),我试过这个:

item = QtGui.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Checked)
self.tableWidget.setHorizontalHeaderItem(1, item)
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

self.tableWidget.horizontalHeaderItem(1).setCheckState(QtCore.Qt.Checked)
Run Code Online (Sandbox Code Playgroud)

这些都不会在水平标题中生成一个复选框.建议表示赞赏.

Gar*_*hes 6

这并不是那么漂亮,但qt-project.org网站上的常见问题解答中发布了解决方案。

我已经针对 Python 调整了解决方案,并进行了评论中建议的一些更改。

from PyQt4.QtCore import Qt, QRect
from PyQt4.QtGui import QTableWidget, QApplication, QHeaderView, QStyleOptionButton, QStyle

import sys

class MyHeader(QHeaderView):

    isOn = False

    def __init__(self, orientation, parent=None):
        QHeaderView.__init__(self, orientation, parent)

    def paintSection(self, painter, rect, logicalIndex):
        painter.save()
        QHeaderView.paintSection(self, painter, rect, logicalIndex)
        painter.restore()

        if logicalIndex == 0:
            option = QStyleOptionButton()
            option.rect = QRect(10, 10, 10, 10)
            if self.isOn:
                option.state = QStyle.State_On
            else:
                option.state = QStyle.State_Off
            self.style().drawControl(QStyle.CE_CheckBox, option, painter)

    def mousePressEvent(self, event):
        self.isOn = not self.isOn
        self.updateSection(0)
        QHeaderView.mousePressEvent(self, event)

class MyTable(QTableWidget):
    def __init__(self):
        QTableWidget.__init__(self, 3, 3)

        myHeader = MyHeader(Qt.Horizontal, self)
        self.setHorizontalHeader(myHeader)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myTable = MyTable()
    myTable.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)