Центрирование QIcon в QTableWidgetItem в PyQt5 - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть QTableWidget, в котором некоторые из QTableWidgetItem содержат один QIcon (не кнопка, не кликабельная, просто изображение).Кто-нибудь может посоветовать мне, как центрировать иконку?Ниже приведен пример кода, который правильно отображает значок, но не центрирует его (setTextAlignment, кажется, работает для элементов, которые содержат текст, но, очевидно, не для значков).

status_item = QtGui.QTableWidgetItem()
status_icon = QtGui.QIcon()
status_icon.addPixmap(QtGui.QPixmap(icon_file), QtGui.QIcon.Normal, QtGui.QIcon.Off)
status_item.setIcon(status_icon)
self.ServiceTableWidget.setItem(row, 0, status_item)
self.ServiceTableWidget.item(row, 0).setTextAlignment(QtCore.Qt.AlignHCenter) #not working

Я также пытался использоватьметод QIcon.paint (), который не работал, хотя, возможно, я неправильно его реализую:

status_icon.paint(QtGui.QPainter(), QtCore.QRect(), QtCore.Qt.AlignCenter)

Заранее спасибо!

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете использовать делегата:

from PyQt5 import QtCore, QtGui, QtWidgets

class IconDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(IconDelegate, self).initStyleOption(option, index)
        if option.features & QtWidgets.QStyleOptionViewItem.HasDecoration:
            s = option.decorationSize
            s.setWidth(option.rect.width())
            option.decorationSize = s

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

        delegate = IconDelegate(self.ServiceTableWidget)  # <--- 
        self.ServiceTableWidget.setItemDelegate(delegate) # <---

        icon_file = "lamp.png"
        status_item = QtWidgets.QTableWidgetItem()
        status_icon = QtGui.QIcon()
        status_icon.addPixmap(QtGui.QPixmap(icon_file), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        status_item.setIcon(status_icon)
        self.ServiceTableWidget.setItem(0, 0, status_item)

        self.setCentralWidget(self.ServiceTableWidget)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

enter image description here

...