【问题标题】:Adjust indents in QTableWidget cells and header items调整 QTableWidget 单元格和标题项中的缩进
【发布时间】:2017-10-14 23:05:53
【问题描述】:

我想在左侧对齐 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_())

【问题讨论】:

    标签: python-3.x pyqt5 qtablewidget


    【解决方案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 方法也很简单,以便在编辑单元格时调整左边距。完整的自定义 item-delegate 将如下所示:

    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)
    

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      相关资源
      最近更新 更多