2017-10-14 668 views
1

我想在左侧对齐QTableWidget中的文本,但我还想添加一个缩进,以便文本不会卡在边框上。在图像上,col_2是我想要的。我希望标题标签也一样。调整QTableWidget单元格和标题项中的缩进

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

对于缩进,在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) 
相关问题