Как печатать Unicode «u033F» несколько раз подряд в PyQt5?

avatar
tckraomuqnt
8 августа 2021 в 16:47
69
1
1

В моем коде QLabel_2 содержит Unicode для двойной линии (u"\u033F"), а QLabel_3 содержит Unicode для Draw Box(u"\2550").
Проблема: Unicode для двойной линии не печатает непрерывно в QLabel, тогда как мы используем этот Unicode в обычном операторе печати, он печатается непрерывно (строка № 11) и в то же время Unicode для поля рисования (в QLabel_3), он работает нормально. Как решить эту проблему (непрерывно печатать двойную черту)?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtCore,QtGui,QtWidgets

class Layout_sample(QtWidgets.QWidget):
    def __init__(self):
        super(). __init__()
        self.setWindowTitle("Layout Sample")
        print((u"\u033f"+u"\u033f"+u"\u033f"+u"\u033f"+u"\u033f"+u"\u033f")      ##its work  file
        self.vbox = QtWidgets.QVBoxLayout()
        self.hbox1 = QtWidgets.QHBoxLayout()
        self.hbox2 = QtWidgets.QHBoxLayout()
        self.hbox3 = QtWidgets.QHBoxLayout()

        self.lbl1 = QtWidgets.QLabel("F3F3F3F3F3")
        self.lbl2 = QtWidgets.QLabel(u"\u033f"+u"\u033f"+u"\u033f"+u"\u033f"+u"\u033f"+u"\u033f")     
        self.lbl3 = QtWidgets.QLabel(u"\u2550"+u"\u2550"+u"\u2550"+u"\u2550")


        self.hbox1.addWidget(self.lbl1)
        self.hbox2.addWidget(self.lbl2)
        self.hbox3.addWidget(self.lbl3)

        self.vbox.addLayout(self.hbox1)
        self.vbox.addLayout(self.hbox2)
        self.vbox.addLayout(self.hbox3)
        self.vbox.addStretch()
        self.vbox.setSpacing(0)
        self.setLayout(self.vbox)

if __name__ =="__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainwindow = Layout_sample()
    mainwindow.show()
    sys.exit(app.exec_())
Источник

Ответы (1)

avatar
musicamante
9 августа 2021 в 03:21
1

Код 033f представляет собой комбинирующий символ. Это означает, что ему требуется другой символ в паре с ним, чтобы правильно отображались. Это похоже на другие более стандартные комбинированные символы, такие как «умлаут» (диэрезис), который обычно сочетается с совместимой буквой и почти никогда не отображается отдельно.

Теперь "проблема" заключается в том, что Qt использует комбинации отдельных символов (включая комбинации символов) для оценки фактического размера и рисунка на основе особенностей шрифта, что в основном относится к кернингу/продвижению (и это, вероятно, источник вашей проблемы) : сами по себе двойные надчеркивания ни с чем не объединяются (если не с собой), поэтому по умолчанию используется «сумма» объединяющего символа с «отсутствием символа» (что по умолчанию равно «одному символу»).

Возможным обходным решением может быть сочетание каждого символа двойной строки с пробелом:

self.lbl2 = QtWidgets.QLabel(u'\u033f ' * 6)

Но это не сработает по двум причинам:

  • ширина "пустого" объединяющего символа не всегда известна и прозрачна;
  • если шрифт неправильно поддерживает комбинирование межсимвольных интервалов, вы получите что-то вроде = = = = (или не полностью черные строки);

Итак, я сомневаюсь, что существует фактическое и правильное решение для того, чего вы пытаетесь достичь (помимо использования символа u2550), но если ваша цель состоит в том, чтобы нарисовать двойную линию над указанным количество пробелов, вы можете предпочесть более простой вариант: использовать QPainter и рисовать линии на основе текущих метрик шрифта.