LINUX.ORG.RU

[Qt] Пара нубских вопросов.

 


0

1

1. Почему в данном куске кода:

QGraphicsEllipseItem *it = new QGraphicsEllipseItem(x, y, w, h);
scene->addItem(it);
qDebug() << it->pos().x() << it->pos().y() << it->scenePos().x() << it ->scenePos().y();
Все четыре выведенных числа будут равны нулю при любых значениях x и y? В документации утверждается:

Returns the position of the item in parent coordinates. If the item has no parent, its position is given in scene coordinates.

Ведь в данном случае item has no parent? Ну и уж

For convenience, you can also call scenePos() to determine the item's position in scene coordinates, regardless of its parent.

На сцене эллипс появляется там, где нужно.

2. При попытке обойти вот этот баг из интереса родил такой вот говнокод:

unsigned int t = 16666;
for(int i=0; i<120; i++)
{
     usleep(t);
     for(int j=0; j<v.size(); j++)
     {
         j[i]->setRotation(angle*i/120);
     }
}
По задумке оно должно реализовывать анимацию поворота для всех элементов вектора v типа QGraphicsEllipseItems*, с fps ~ 60. Но на деле весь GraphicsView просто фризился на время выполнения цикла. Что я недопонял?

★★★
Ответ на: комментарий от zJes

>QPropertyAnimation посмотри... :)
Да уже посмотрел, спасибо. Насчет usleep понятно, что он его останавливает. Но ведь rotate происходит после usleep и значит view должен перерисоваться, пусть даже с некоторой задержкой?

unikoid ★★★
() автор топика
Ответ на: комментарий от unikoid

Не факт, зависит от CacheMode или ViewportUpdateMode и тд.
Можешь апдейтнуть сцену.

zJes ★★
()

1. То что подставляется в конструктор QGraphicsEllipseItem - это прямоугольник (в который будет вписан эллипс), который к координатам самого эллипса отношения не имеет. Координаты, те что QGraphicsItem::pos(), всегда будут (0,0), пока вы их сдвинете с помощью setPos() или moveBy(). Это точка отсчёта item'а, относительно которых рисуется эллипс. А scenePos() совпадает с pos(), потому что по-умолчанию item добавляется в начало координат сцены.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

> это прямоугольник (в который будет вписан эллипс), который к координатам самого эллипса отношения не имеет.
Да, это ясно.

Координаты, те что QGraphicsItem::pos(), всегда будут (0,0), пока вы их сдвинете с помощью setPos() или moveBy(). Это точка отсчёта item'а, относительно которых рисуется эллипс. А scenePos() совпадает с pos(), потому что по-умолчанию item добавляется в начало координат сцены.

А в какие координаты возвращает метод rect()? В смысле в какой координатной системе?

unikoid ★★★
() автор топика
Ответ на: комментарий от unikoid

Относительно точки отсчёта эллипса, то-есть те, что были подставлены в конструктор. А на сцене это уже может быть не QRectF, а QPolygonF, из-за множества промежуточных трансформаций.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

>Относительно точки отсчёта эллипса, то-есть те, что были подставлены в конструктор.
Спасибо, понял.

unikoid ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.