Преместване на позицията на `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