2015-02-19 1 views
1

Я новичок в Qt. Я представляю события из своего приложения в качестве полигонов в своей сцене, используя пользовательский класс, который наследует QGraphicsPolygomItem. Размеры полигона равны (event duration, fixed height), используя 1s: 1px. Длительность события может быть как 1E-6, так что я просто масштабировать мой взгляд, так что меньше полигонов масштабируется до MIN_POLY_WIDTH (10px):Qt: Масштабы полигонов, но не детей

view->scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));

enter image description here

До сих пор так хорошо. Тем не менее, у меня есть QGraphicsTextItem ребенка для каждого полигона, которые получают простиралась от операции масштаба до точки, которые они получают путь вне границ полигона:

enter image description here

Текст элемент создается следующим образом:

void EventPolygon::setId(QString id) {          
    if (!this->id) { 
    this->id = new QGraphicsTextItem(id, this); 
    } else { 
    this->id->setPlainText(id); 
    } 
    this->id->setPos(0, this->polygon().boundingRect().height()/2 - this->id->boundingRect().height()/2); 
} 

Эта функция обычно вызывается конструктором EventPolygon. Я, хотя это была проблема, поскольку scale выполняется после того, как все элементы добавлены в сцену, так что это повлияет на текстовые элементы. Поэтому я попытался позвонить setIdпосле операции масштабирования, итерации по всем элементам сцены. Таким образом, хотя бы были растянуты только многоугольники. Это было не так, и текст оставался растянутым.

Я также попытался использовать следующие вместо scale:

QTransform t = QTransform();             
t.scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));       
view->setTransform(t, false); 

Я думал, «ложь» позволит избежать преобразования, внесенной в многоугольников детей, однако, кажется, что это не так. Можно ли каким-либо образом масштабировать полигоны до минимальной ширины 10 пикселей и иметь в них читаемый текст?

ответ

1

QGraphicsScene формирует иерархию сценографа, основанную на отношениях родитель-ребенок, преобразования наследуются по этой иерархии - нет никакого способа обойти это (см. Раздел Трансформации).

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

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

Это было не так, и текст оставался растянутым.

Изменение стека преобразования вызовет перерисовку, поэтому не имеет значения, когда установить масштаб.

Я думал, «ложь» позволит избежать преобразования применяется к многоугольников детей

Нет, combine аргумент когда ложь просто отменяет существующую матрицу преобразования с одним вы обеспечиваете.

+0

Я вижу, сейчас я изменю соотношение и буду больше читать об организации сцены. Благодарю. – Alex

Смежные вопросы