可检查的Qstandard项能否在QStandardItemModel列中居中?

2024-05-23 21:52:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有一列复选框的table类。我想把这些放在列的中心,但是使用item.setTextAlignment(Qt.AlignCenter)不起作用

from PyQt5.QtWidgets import *
from PyQt5.QtCore import (QDate, QDateTime, QRegExp, QSortFilterProxyModel, Qt,
        QTime, QModelIndex, QSize, pyqtSignal, QObject)
from PyQt5.QtGui import QStandardItemModel, QIcon, QStandardItem

class Table(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.initUI()
        self.show()

    def initUI(self):
        mainLayout = QVBoxLayout()

        self.proxyModel = QSortFilterProxyModel()
        self.proxyModel.setDynamicSortFilter(True)

        self.sourceModel = QStandardItemModel(0, 2, self)
        self.sourceModel.setHeaderData(0, Qt.Horizontal, '')
        self.sourceModel.setHeaderData(1, Qt.Horizontal, 'Value')

        self.proxyModel.setSourceModel(self.sourceModel)

        self.proxyGroupBox = QGroupBox('data')

        self.proxyView = QTreeView()
        self.proxyView.setRootIsDecorated(False)
        self.proxyView.setAlternatingRowColors(True)
        self.proxyView.setModel(self.proxyModel)

        self.proxyView.setEditTriggers(QAbstractItemView.NoEditTriggers)

        proxyLayout = QGridLayout()
        proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
        self.proxyGroupBox.setLayout(proxyLayout)

        mainLayout.addWidget(self.proxyGroupBox)
        self.setLayout(mainLayout)

        for i in range(5):
            self.proxyView.resizeColumnToContents(0)
            item = QStandardItem(True)
            item.setCheckable(True)
            item.setCheckState(False)
            #item.setTextAlignment(Qt.AlignCenter)
            self.sourceModel.setItem(i, 0, item)
            self.sourceModel.setData(self.sourceModel.index(i, 1), i+1)

    def setSourceModel(self, model):
        self.proxyModel.setSourceModel(model)

if __name__=='__main__':
    import sys

    app = QApplication(sys.argv)
    window = Table()
    sys.exit(app.exec_())

第一列的每一项都要居中吗


Tags: fromimportselftruedefitemqtpyqt5
1条回答
网友
1楼 · 发布于 2024-05-23 21:52:13

如果要更改复选框的对齐方式,则必须使用QProxyStyle:

class CheckBoxProxyStyle(QProxyStyle):
    def subElementRect(self, element, option, widget):
        rect = super().subElementRect(element, option, widget)
        if element == QStyle.SE_ItemViewItemCheckIndicator:
            rect.moveCenter(option.rect.center())
        return rect
self.proxyView = QTreeView()
self.proxyView.setStyle(CheckBoxProxyStyle(self.proxyView.style()))

enter image description here

相关问题 更多 >