2015-02-03 7 views
1

Я использую QGraphicsTextItem, чтобы нарисовать текст на сцене. Текст нарисован вдоль пути (QGraphicsPathItem), который является родительским элементом моего QGraphicsTextItem - поэтому изменение текста изменяется вдоль элемента пути и приклеивается к нему при масштабировании вида. Но размер шрифта QGraphicsTextItem также меняется при масштабировании вида - этого я и стараюсь избегать. Я установил QGraphicsItem :: ItemIgnoresTransformations flag to QGraphicsTextItem перестает вращаться, пока он является родителем (QGraphicsPathItem).Предотвращение масштаба шрифта в QGraphicsItem

enter image description here

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

void Label::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    // Store current position and rotation 
    QPointF position = pos(); 
    qreal angle = rotation(); 

    // Store current transformation matrix 
    QTransform transform = painter->worldTransform(); 

    // Reset painter transformation 
    painter->setTransform(QTransform()); 

    // Rotate painter to the stored angle 
    painter->rotate(angle); 

    // Draw the text 
    painter->drawText(mapToScene(position), toPlainText()); 

    // Restore transformation matrix 
    painter->setTransform(transform); 
} 

Положение (и вращение) моего текста на экране непредсказуема :( Что я делаю неправильно Спасибо очень много? заранее.

+1

У меня есть аналогичная проблема с QGraphicsTextItem: игнорирование преобразований вызывает заметное смещение в позиции с другой шкалой взглядов. Я считаю, что центровка может решить эту проблему. – handle

ответ

0

следующее решение работало отлично для меня:

void MyDerivedQGraphicsItem::paint(QPainter *painter, const StyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    double scaleValue = scale()/painter->transform().m11(); 
    painter->save(); 
    painter->scale(scaleValue, scaleValue); 
    painter->drawText(...); 
    painter->restore(); 
    ... 
} 

Мы также можем умножить scaleValue другими Весов мы хотим сохранить его размер постоянной вне среды сохранения/восстановления.

QPointF ref(500, 500); 
QPointF vector = scaleValue * QPointF(100, 100); 
painter->drawLine(ref+vector, ref-vector); 
1

Я имел этот вопрос один раз. Вместо того, чтобы игнорировать преобразования, вам нужно масштабировать вниз элементы, которые вы не хотите, чтобы быть увеличено в вашем трансфокатора в функции.

при увеличении масштаба, если вы измените масштаб b y ds, например, по шкале от 1.0/ds

Возможно, вам придется менять положение.

Надеюсь, это поможет.

Редактировать: Надеюсь, я правильно понял вопрос.

3

Я решил проблему таким образом - для рисования линии/круг/прямоугольник/путь, который я хочу быть трансформированы, я использую соответствующий QGraphicsLine/Ellipse/Rect/PathItem , Для рисования текста (, который я НЕ хочу преобразовать) Я использую QGraphicsSimpleTextItem. Я установил флаг текста, чтобы игнорировать трансормирования и установить родительский элемент в элемент Line/Ellipse/Rect/Path. Элемент Line/Ellipse/Rect/Path преобразуется, но текст не делает - это то, что я хотел. Я также могу повернуть текст и установить его положение. Большое спасибо за ответы.