2017-10-14 28 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 ReferenceQTableWidget::itemQHeaderView::sectionセレクタを使用することが可能でなければならないことを示唆している:

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

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

ただし、Iはパディングのすべての様々な組み合わせを試し、マージンと境界線の設定を確認し、まったく動作しないか、奇妙で醜い副作用があることを発見しました。 SOなどのいくつかの同様の質問を見た後、これらのスタイルシート設定の正確な振る舞いは、使用しているPlaformや使用しているウィジェットスタイルによって異なります。うまくいけば、彼らはあなたのためにうまくいくだろうが、あなたはいくつかの不具合を見つける場合は驚かないでください。

スタイルシートソリューションがうまくいかない場合、ほとんどの人はカスタムアイテムデリゲートを使用します。これは通常、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) 
関連する問題