Строки равной длины PyQt с пробелами имеют разную длину отображения

#python #pyqt #pyqt5

#python #pyqt #pyqt5

Вопрос:

В PyQt5 я обнаружил, что строки одинаковой длины с пробелами имеют разную конечную длину отображения:

введите описание изображения здесь

в то время как желаемый результат должен быть похож:

 123456789
1 3456789
1  456789
1   56789
 

Я обнаружил, что эта проблема существует не только в QComboBox , но и в других многорядных виджетах. Фиксированная длина, например {:15s} , также вызывает проблему.

Есть ли способ отобразить желаемый результат?

Минимальный пример описанной проблемы:

 from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow
import sys

class Window(QMainWindow):
    def __init__(self): 
        super().__init__() 
        self.combo_box = QComboBox(self)
        a = ["123456789", "1 3456789", "1  456789", "1   56789"]
        self.combo_box.addItems(a)
        self.show()

App = QApplication(sys.argv) 
window = Window()
sys.exit(App.exec())
 

Комментарии:

1. В вашем выпадающем списке необходимо использовать моноширинный шрифт, чтобы каждый символ имел одинаковую ширину.

2.Следует отметить, что это не проблема, это не связано с PyQt и не имеет ничего общего с «многострочными виджетами». Это типичная особенность любого шрифта переменной длины. Вы когда-нибудь замечали, что «ooo» имеет другую ширину, чем «lll»? Следовательно, «o o» будет иметь другую ширину, чем «ooo» (поскольку «l l» и «o o», очевидно, не могут иметь одинаковую ширину). Это относится к любому символу, включая пробелы (которые обычно тоньше, чем цифры) и знаки препинания, и это также верно для большинства шрифтов, даже с цифрами: «8» не всегда такой большой, как «1».

3. Привет, Маурицио. Спасибо, что указали на это. Нет, я изначально не думал, что это проблема со шрифтом. Что заставило меня думать, что это потому, что моя часто используемая среда программирования (Vim, Sublime, Notepad, консоль Windows Python, терминал gnome …) указывает, что «ooo» имеет ту же ширину, что и «iii».

Ответ №1:

Смещение вызвано шрифтом, поскольку он не дает вам одинакового пространства между буквами и пробелами. Решение состоит в том, чтобы использовать шрифт типа «monospace»:

 from PyQt5.QtGui import QFont

font = QFont("monospace")
self.combo_box.setFont(font)
 

Комментарии:

1. В дополнение, для эстетических целей, особенно когда есть символы, похожие на русские, загрузите и добавьте шрифт «Consolas» вместо monospace .