2017-01-31 17 views
2

私はキーと値のペアを表す文字列のリストを表示するリストビューを持っています。文字列の長さはすべて同じですが、ピクセルの長さが異なるため、リストの長さが異なります。PyQt:QListView内でテキストを左右に整列させる

someValue   1000.93 
someOtherValue  98.7 
oneMoreValue  11200000.00 

うまくそれは左と右の整列に見えるように文字列をフォーマットする方法はあり、このような:

someValue   1000.93 
someOtherValue  98.7 
oneMoreValue 11200000.00 

私はこのような文字列を作成するので、それは次のようになります。

+0

はプロポーショナルフォントが使用された場合、一貫行うことはほとんど不可能です。また、アイテムの追加/削除時やリストビューのサイズ変更時に、リストのフォーマットを変更するという問題もあります。 1つの部分が変更された場合、リスト全体の書式を再計算する必要があります(最も長い項目の長さを知ることに依存するため)。 – ekhumoro

答えて

1
s = '{:20}'.format(key) + '{:>20}'.format(val) 

QTreeViewは、複数の列を可能にするQListView、ように動作するように構成することができます。各列には独自のアライメント設定があります(とりわけ)。また、サイズ変更後の配置も保持されます。

基本的な実装では、このようなものになるだろう:列にテキストを配置するスペースを使用し

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 

class ListView(QtWidgets.QTreeView): 
    def __init__(self, *args, **kwargs): 
     super(ListView, self).__init__(*args, **kwargs) 
     self.setModel(QtGui.QStandardItemModel(self)) 
     self.model().setColumnCount(2) 
     self.setRootIsDecorated(False) 
     self.setAllColumnsShowFocus(True) 
     self.setSelectionBehavior(
      QtWidgets.QAbstractItemView.SelectRows) 
     self.setHeaderHidden(True) 
     self.header().setStretchLastSection(False) 
     self.header().setSectionResizeMode(
      0, QtWidgets.QHeaderView.Stretch) 
     self.header().setSectionResizeMode(
      1, QtWidgets.QHeaderView.ResizeToContents) 

    def addItem(self, key, value): 
     first = QtGui.QStandardItem(key) 
     second = QtGui.QStandardItem(value) 
     second.setTextAlignment(QtCore.Qt.AlignRight) 
     self.model().appendRow([first, second]) 

class Window(QtWidgets.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.view = ListView(self) 
     for text in 'Aquamarine Red Green Purple Blue Yellow '.split(): 
      self.view.addItem(text, str(16 ** len(text))) 
     layout = QtWidgets.QVBoxLayout(self) 
     layout.addWidget(self.view) 

if __name__ == '__main__': 

    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 300, 200) 
    window.show() 
    sys.exit(app.exec_()) 
+0

ありがとう、それは今よりきれいに見える – chrise

関連する問題