Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 调整QTableWidget单元格和标题项中的缩进_Python 3.x_Pyqt5_Qtablewidget - Fatal编程技术网

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)