Проблема с текстом в 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
Это не ответ Виктору, но уточнение его вопроса и замечания по комментариям к нему (я программист-исполнитель):
- Без
Qt::TextWordWrapпроблема остается (проверено) и, разумеется, переноса строк не происходит при отрисовке текста внутри потомкаQGraphicsItem - Вызов отрисовки текста:
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 не могут объединяться
- Наконец, по поводу кода. Схема наследования такова (потомок->родитель): 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();
}
}