Сдвинуть положение `QGraphicsTextItem` относительно центра текста?

У меня есть несколько классов, наследуемых от QGraphicsItem, которые должны быть организованы определенным образом. Для простоты вычислений я сделал сцены и элементы с центром в (0, 0) (где boundingRect() имеет +/- координаты).

QGraphicsTextItem подкласс бросает мне вызов, его pos() относится к верхней левой точке.

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

Я представлял себе, что решение должно быть чем-то простым, например

void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
    painter->translate( -boundingRect().width()/2.0, -boundingRect().height()/2.0 );
    QGraphicsTextItem::paint(painter, option, widget );    
}

вышеприведенный «вид» работает, но когда я увеличиваю масштаб элемента -> увеличиваю шрифт, отображаемый элемент обрезается...

Я попытался установить pos(), но проблема в том, что мне все еще нужно отслеживать фактическое положение на сцене, поэтому я не могу просто заменить его.

Немного неприятный побочный эффект — центрирование QGraphicsView по элементу тоже не работает.

Как я могу заставить мой QGraphicsTextItem показывать свое положение относительно центра текста?

Редактировать: один из экспериментов по изменению boundingRect():

QRectF TextItem::boundingRect() const
{
    QRectF rect = QGraphicsTextItem::boundingRect();
    rect.translate(QPointF(-rect.width()/2.0, -rect.height()/2.0));
    return rect;
}

person Thalia    schedule 04.05.2015    source источник
comment
Я думаю, что если вы переопределяете paint(), вы также должны переопределять boundingRect(), чтобы нарисованный текст лежал в прямоугольнике, возвращаемом boundingRect().   -  person Frank Osterfeld    schedule 04.05.2015
comment
Я пытался, когда я пытаюсь перевести boundingRect(), я получаю обрезанный текст... (см. редактирование кода)   -  person Thalia    schedule 04.05.2015


Ответы (1)


Мне пришлось сместить начальную позицию, а также изменить размер, чтобы вызвать новую позицию — я не смог сделать это в paint(), потому что, как я думал с самого начала, любая перерисовка будет постоянно пересчитывать позицию.

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

В конструкторе

setPos(- boundingRect().width()/2, - boundingRect().height()/2);

в функции, изменяющей размер элемента (шрифта),

void TextItem::setSize(int s)
{
    QRectF oldRect = boundingRect();
    QFont f;
    f.setPointSize(s);
    setFont(f);
    if(m_scale != s)
    {
        m_scale = s;
        qreal x = pos().x() - boundingRect().width()/2.0 + oldRect.width()/2.0;
        qreal y = pos().y() - boundingRect().height()/2.0 + oldRect.height()/2.0;
        setPos(QPointF(x, y));
    }
}
person Thalia    schedule 04.05.2015