Python PyQt:在QListView中左右对齐文本

Python PyQt:在QListView中左右对齐文本,python,pyqt,alignment,qtreeview,qlistview,Python,Pyqt,Alignment,Qtreeview,Qlistview,我有一个列表视图,它显示代表键、值对的字符串列表。这些字符串都具有相同的字符长度,但由于像素长度不同,它们在列表中显示的长度不同。所以,它看起来像这样: someValue 1000.93 someOtherValue 98.7 oneMoreValue 11200000.00 someValue 1000.93 someOtherValue 98.7 oneMoreValue 11200000.00 s = '{:20}'

我有一个列表视图,它显示代表键、值对的字符串列表。这些字符串都具有相同的字符长度,但由于像素长度不同,它们在列表中显示的长度不同。所以,它看起来像这样:

someValue         1000.93
someOtherValue     98.7
oneMoreValue     11200000.00
someValue          1000.93
someOtherValue        98.7
oneMoreValue   11200000.00
s = '{:20}'.format(key) + '{:>20}'.format(val)
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_())
是否有一种方法可以很好地格式化字符串,使其看起来左右对齐,如下所示:

someValue         1000.93
someOtherValue     98.7
oneMoreValue     11200000.00
someValue          1000.93
someOtherValue        98.7
oneMoreValue   11200000.00
s = '{:20}'.format(key) + '{:>20}'.format(val)
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_())
我创建如下字符串:

someValue         1000.93
someOtherValue     98.7
oneMoreValue     11200000.00
someValue          1000.93
someOtherValue        98.7
oneMoreValue   11200000.00
s = '{:20}'.format(key) + '{:>20}'.format(val)
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_())
可以将配置为类似于
QListView
,这样就可以允许多个列。然后,每个列都可以有自己的对齐设置(以及其他设置)。它还将在调整大小后保留对齐

基本实现如下所示:

someValue         1000.93
someOtherValue     98.7
oneMoreValue     11200000.00
someValue          1000.93
someOtherValue        98.7
oneMoreValue   11200000.00
s = '{:20}'.format(key) + '{:>20}'.format(val)
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_())

使用比例字体时,使用空格对齐列中的文本几乎不可能做到一致。此外,每当添加/删除项目或调整listview的大小时,也会出现重新格式化列表的问题。如果某个部分发生更改,则需要重新计算整个列表的格式(因为这取决于知道最长项目的长度)。