Проблема с текстом в Qt

Есть программа по работе с текстом(технические данные ниже) в некоторых словах появляются баги наложение букв или очень большая удаленность их друг от друга в слове. Просьба смотреть фото.введите сюда описание изображения

введите сюда описание изображения Использование моноширных шрифтов не решает проблему на 100%

Используется Qt5.9.9, MinGW 5.3
При изменении геометрии или перемещении по горизонтали элемента графики, содержащего текст, интервал между буквами не постоянен и колеблется (это хорошо видно на записи экрана).

Класс элемента текста унаследован от QGraphicsItem, отрисовка реализована через QPainter::drawText:

void QPainter::drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)

следующим образом:

painter->drawText(rect(), Qt::TextWordWrap, text4show_);

Попытка применить QTextDocument::drawContents к явному успеху не привела, но уменьшила быстродействие.

Дополнение от @Ingwar Smith

Это не ответ Виктору, но уточнение его вопроса и замечания по комментариям к нему (я программист-исполнитель):

  1. Без Qt::TextWordWrap проблема остается (проверено) и, разумеется, переноса строк не происходит при отрисовке текста внутри потомка QGraphicsItem
  2. Вызов отрисовки текста:

painter->drawText(rect(), flags, text4show_);

При этом flags (тип int32_t) может быть результатом побитового ИЛИ между флагами:

Qt::AlignLeft
Qt::AlignRight
Qt::AlignHCenter
Qt::AlignJustify
Qt::AlignTop
Qt::AlignBottom
Qt::AlignVCenter
Qt::AlignCenter
Qt::TextDontClip
Qt::TextSingleLine
Qt::TextExpandTabs
Qt::TextShowMnemonic
Qt::TextWordWrap
Qt::TextIncludeTrailingSpaces

-- за исключением того, что Qt::TextWordWrap и Qt::TextSingleLine не могут объединяться

  1. Наконец, по поводу кода. Схема наследования такова (потомок->родитель): TextItem -> Item -> QGraphicsItem

-- From Item header:

class Item : public QGraphicsItem { / ... / };

-- From TextItem header:

class TextItem : public Item
{
public:
    TextItem(QGraphicsItem *parent = nullptr);

    // ...

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;

    // ...

private:
    // ...
    QString text4show_;
    Qt::Alignment alignment_;
    bool multiline_;
};

-- From TextItem cpp-file:

void TextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->save();
    painter->setRenderHint(QPainter::TextAntialiasing, true);
    painter->setRenderHint(QPainter::Antialiasing, true);
    // ...

    int flags = alignment_;
    if (!multiline_)
    {
        flags |= Qt::TextSingleLine;
    }
    else
    {
        flags |= Qt::TextWordWrap;
    }

    painter->drawText(rect(), flags, text4show_);

    painter->restore();
    Item::paint(painter, option, widget); // этот вызов приведен ниже
}

-- From Item cpp-file:

void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{
    if (select_ && rect_.isValid()) { // в общем, это рисует прямоугольник границ элемента (Item'а)
        painter->save();
        painter->setPen(QPen(QColor(79, 128, 255), lead_ ? 0.6 : 0.3));
        painter->drawRect(rect_);
        painter->restore();
    }
}

Ответы (0 шт):