Изначально я работал с PyQt5. Всё было ок - ставил шрифт QtGui.QFont(“Courier”) и отрисовка происходила корректно.
Но, по требованию работодателя (из-за ограничений лицензии на PyQt5), пришлось перейти на PySide6. Возникло ряд проблем. Почти все из них удалось решить, кроме пары проблем. Одна из нерешённых: Не удаётся подобрать моноширинный шрифт. Шрифт “Courier” ведёт себя не как моноширинный. Что очень странно. Пробовал и другие шрифты, которые должны быть моноширинными - ситуация аналогичная.
Простой тестовый код:
def paintEvent(paintEvent(self, ev):
qp = QtGui.QPainter()
...
fm = qp.fontMetrics()
s = '.'
for j in range(2):
c = 0
for i in range(1, 16):
c0 = c
c = fm.horizontalAdvance(s * i)
print("'{:s}': {:3d}, {:2d}".format(s, c, c - c0))
s = 'W'
'.': 7, 7
'.': 14, 7
'.': 22, 8
'.': 29, 7
'.': 36, 7
'.': 43, 7
'.': 50, 7
'.': 58, 8
'.': 65, 7
'.': 72, 7
'.': 79, 7
'.': 86, 7
'.': 93, 7
'.': 101, 8
'.': 108, 7
'W': 7, 7
'W': 14, 7
'W': 22, 8
'W': 29, 7
'W': 36, 7
'W': 43, 7
'W': 50, 7
'W': 58, 8
'W': 65, 7
'W': 72, 7
'W': 79, 7
'W': 86, 7
'W': 93, 7
'W': 101, 8
'W': 108, 7
'.': 8, 8
'.': 16, 8
'.': 24, 8
'.': 32, 8
'.': 40, 8
'.': 48, 8
'.': 56, 8
'.': 64, 8
'.': 72, 8
'.': 80, 8
'.': 88, 8
'.': 96, 8
'.': 104, 8
'.': 112, 8
'.': 120, 8
'W': 8, 8
'W': 16, 8
'W': 24, 8
'W': 32, 8
'W': 40, 8
'W': 48, 8
'W': 56, 8
'W': 64, 8
'W': 72, 8
'W': 80, 8
'W': 88, 8
'W': 96, 8
'W': 104, 8
'W': 112, 8
'W': 120, 8
Почему так? Получается, что в PySide6 ширина символов варьируется в зависимости от позиции в строке??? =-O
И как всё-таки задать корректный моноширинный шрифт в PySide6? Есть такая возможность вообще? В инете искал долго - ничего вменяемого по этому вопросу не нашёл.
Или может QPainter нужно как-то пнуть, чтобы он рисовал текст правильно?
PS: Прошу сильно не пинать если что не так сказал - в Python-е я новичок.