2017-10-14 3 views
1

Je voudrais aligner les textes dans un QTableWidget sur le côté gauche, mais je voudrais également ajouter un retrait afin que le texte ne soit pas collé contre la bordure. Sur l'image, col_2 est ce que je veux. Et je voudrais la même chose pour les étiquettes d'en-tête.Ajuster les retraits dans les cellules QTableWidget et les éléments d'en-tête

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

Répondre

1

Pour les tirets, le QSS Reference suggère qu'il devrait être possible d'utiliser les QTableWidget::item et QHeaderView::section sélecteurs:

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

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

Cependant, j'ai essayé toutes les différentes combinaisons de rembourrage, paramètres de marge et de bordure, et ont constaté qu'ils ne fonctionnent pas du tout, ou ont des effets secondaires étranges et laids. Après avoir examiné plusieurs questions similaires sur SO et ailleurs, il semble que le comportement exact de ces paramètres de feuille de style dépend de ce que vous êtes sur et/ou quel style de widget que vous utilisez. J'espère qu'ils fonctionneront bien pour vous, mais ne soyez pas surpris si vous trouvez quelques problèmes.

Si la solution de feuille de style ne fonctionne pas, la plupart des personnes utilisent un délégué d'élément personnalisé. Cela implique généralement de réimplémenter la méthode paint. Cependant, une approche alternative serait de réimplémenter la méthode displayText et de remplir le texte renvoyé avec des espaces. Cela n'affecte en rien les données sous-jacentes et donne des résultats complètement équivalents d'une manière beaucoup plus simple. Il est également très simple de réimplémenter la méthode createEditor afin que la marge de gauche soit ajustée lors de l'édition des cellules. L'élément-délégué complet sur mesure doit ressembler à ceci:

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 

et il peut être utilisé comme ceci:

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

La dernière pièce du puzzle est le tiret pour les éléments d'en-tête. Pour cela, il semble plus simple d'ajouter que quelques espaces au texte de l'étiquette:

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

Et l'alignement des étiquettes d'en-tête peuvent être configurés comme ceci:

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