调整QTableWidget单元格和标题项中的缩进

时间:2017-10-14 23:05:53

标签: python-3.x pyqt5 qtablewidget

我想在左侧的QTableWidget中对齐文本,但我还想添加缩进以使文本不会粘在边框上。在图像上,col_2是我想要的。我希望标题标签也一样。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QTableWidgetItem

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.gridLayout = QtWidgets.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.tableWidget = QtWidgets.QTableWidget(Form)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(2)
        entries = ['aa','bb','cc','dd','ee']
        for row, form in enumerate(entries):
            self.tableWidget.insertRow(row)
            for column, item in enumerate(form):
                self.tableWidget.setItem(row, column, QTableWidgetItem(str(item)))

        self.tableWidget.setHorizontalHeaderLabels(['col_1', 'col_2'])

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

enter image description here

1 个答案:

答案 0 :(得分:1)

对于缩进,QSS Reference表示应该可以使用QTableWidget::itemQHeaderView::section选择器:

self.tableWidget.setStyleSheet("""
    QTableWidget::item {padding-left: 5px; border: 0px}
    """)

self.tableWidget.horizontalHeader().setStyleSheet("""
    QHeaderView::section {padding-left: 5px; border: 0px}
    """)

然而,我尝试了填充,边距和边框设置的所有各种组合,并发现它们要么根本不起作用,要么具有奇怪和丑陋的副作用。在SO和其他地方查看了几个类似的问题之后,这些样式表设置的确切行为似乎取决于您所使用的平台和/或您正在使用的小部件样式。希望他们能为你工作,但如果你发现一些小问题,不要感到惊讶。

如果样式表解决方案无效,大多数人都会使用自定义项目委托。这通常涉及重新实现paint方法。但是,另一种方法是重新实现displayText方法并用空格填充返回的文本。这根本不会影响基础数据,并以更简单的方式提供完全相同的结果。重新实现createEditor方法也非常简单,以便在编辑单元格时调整左边距。完整的自定义项目委托将如下所示:

class PaddingDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, padding=1, parent=None):
        super(PaddingDelegate, self).__init__(parent)
        self._padding = ' ' * max(1, padding)

    def displayText(self, text, locale):
        return self._padding + text

    def createEditor(self, parent, option, index):
        editor = super().createEditor(parent, option, index)
        margins = editor.textMargins()
        padding = editor.fontMetrics().width(self._padding) + 1
        margins.setLeft(margins.left() + padding)
        editor.setTextMargins(margins)
        return editor

它可以像这样使用:

self.delegate = PaddingDelegate()
self.tableWidget.setItemDelegate(self.delegate)

拼图的最后一部分是标题项的缩进。为此,在标签文本中添加一些空格似乎最简单:

self.tableWidget.setHorizontalHeaderLabels([' col_1', ' col_2'])

标题标签的对齐方式可以这样设置:

self.tableWidget.horizontalHeader().setDefaultAlignment(
    QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)