Python 3.x 调整QTableWidget单元格和标题项中的缩进
我想在左侧的Python 3.x 调整QTableWidget单元格和标题项中的缩进,python-3.x,pyqt5,qtablewidget,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")
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_())
对于缩进,建议可以使用和选择器:
self.tableWidget.setStyleSheet("""
QTableWidget::item {padding-left: 5px; border: 0px}
""")
self.tableWidget.horizontalHeader().setStyleSheet("""
QHeaderView::section {padding-left: 5px; border: 0px}
""")
然而,我尝试了填充、边距和边框设置的所有组合,发现它们要么根本不起作用,要么有奇怪和丑陋的副作用。在研究了SO和其他地方的几个类似问题之后,这些样式表设置的确切行为似乎取决于您所使用的平台和/或小部件样式。希望它们能为您工作,但如果您发现一些小故障,请不要感到惊讶
如果样式表解决方案不起作用,大多数人会使用自定义项委托。这通常涉及重新实现该方法。但是,另一种方法是重新实现该方法,并在返回的文本中填充空格。这根本不会影响底层数据,并以更简单的方式给出完全等效的结果。重新实现该方法也非常简单,这样编辑单元格时,左边距就可以调整。完整的自定义项委托将如下所示:
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.horizontalHeader().setDefaultAlignment(
QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
它可以这样使用:
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.horizontalHeader().setDefaultAlignment(
QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
拼图的最后一块是标题项的缩进。为此,在标签文本中添加一些空格似乎是最简单的:
self.tableWidget.setHorizontalHeaderLabels([' col_1', ' col_2'])
标题标签的对齐方式可以如下设置:
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.horizontalHeader().setDefaultAlignment(
QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)