выровнять растровое изображение в центре столбца с помощью QTreeView и QAbstractItemModel - PullRequest
1 голос
/ 04 июня 2019

Как сделать выравнивание растрового изображения по центру его столбца в QTreeView? У меня есть 2 столбца с иконками, которые выровнены по левому краю, но я хочу, чтобы один из них был центрирован, так что это должно работать на одном столбце, а не заставлять всю таблицу выравниваться по одному.

Я использую QTreeView с QAbstractItemModel в качестве модели. В одном столбце я пометил его как QtCore.Qt.DecorationRole и вернул растровое изображение в методе data() модели, чтобы оно отображало изображения вдоль этого столбца.

Все работает хорошо, за исключением того, что все изображения выровнены по левому краю, и я не могу расположить их по центру по горизонтали.

В методе data() я попытался вернуть QtCore.Qt.AlignCenter, если роль была QtCore.Qt.TextAlignmentRole, но, похоже, это влияет только на текст (дух!).

Есть ли другой способ добиться этого? Я не заинтересован в выборе маршрута для делегатов, если это возможно.

1 Ответ

1 голос
/ 04 июня 2019

Возможное решение - переписать делегатский метод initStyleOption():

from PySide2 import QtCore, QtGui, QtWidgets


class IconCenterDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(IconCenterDelegate, self).initStyleOption(option, index)
        option.decorationAlignment = (
            QtCore.Qt.AlignHCenter | QtCore.Qt.AlignCenter
        )
        option.decorationPosition = QtWidgets.QStyleOptionViewItem.Top


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QTreeView()
    model = QtGui.QStandardItemModel(w)
    w.setModel(model)
    delegate = IconCenterDelegate(w)
    w.setItemDelegateForColumn(1, delegate)
    icons = [
        "SP_TitleBarMinButton",
        "SP_TitleBarMenuButton",
        "SP_TitleBarMaxButton",
        "SP_TitleBarCloseButton",
        "SP_TitleBarNormalButton",
        "SP_TitleBarShadeButton",
        "SP_TitleBarUnshadeButton",
        "SP_TitleBarContextHelpButton",
        "SP_MessageBoxInformation",
        "SP_MessageBoxWarning",
        "SP_MessageBoxCritical",
        "SP_MessageBoxQuestion",
        "SP_DesktopIcon",
    ]
    parent = model.invisibleRootItem()
    for icon_name in icons:
        icon = QtWidgets.QApplication.style().standardIcon(
            getattr(QtWidgets.QStyle, icon_name)
        )
        its = []
        for _ in range(3):
            it = QtGui.QStandardItem()
            it.setIcon(icon)
            its.append(it)
        parent.appendRow(its)
    model.appendRow(it)
    w.resize(640, 480)
    w.expandAll()
    w.show()
    sys.exit(app.exec_())

enter image description here


Если вы хотите, чтобы значки всех столбцов выравнивались по центру, вы можете перезаписать метод viewOptions () представления:

class TreeView(QtWidgets.QTreeView):
    def viewOptions(self):
        option = super().viewOptions()
        option.decorationAlignment = (
            QtCore.Qt.AlignHCenter | QtCore.Qt.AlignCenter
        )
        option.decorationPosition = QtWidgets.QStyleOptionViewItem.Top
        return option
...