可检查的Qstandard项目是否可以在QStandardItemModel列的中心?

问题描述 投票:0回答:1

我有一个带有一列复选框的表类。我想将它们放在列的中心,但是使用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_())

总有第一列的每个项目居中吗?

python pyqt pyqt5
1个回答
2
投票

如果要更改复选框的对齐方式,则必须使用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

© www.soinside.com 2019 - 2024. All rights reserved.