2014-12-06 11 views
0

У меня есть прямоугольник, который используется в пределах QGraphicsItem. Элемент добавляется в сцену и имеет предварительно определенное преобразование, так что он правильно отображает прямоугольник. Это было до сих пор так хорошо:QGraphicsItem - Ошибка трансформации объекта

QRectF rect;  
QTransform transform;  
QGraphicsPolygonItem box; 

box.setTransform(transform);  
box.setPolygon(rect); 

qDebug() << rect; 
qDebug() << transform; 
qDebug() << transform.map(rect.topLeft()); 
qDebug() << transform.map(rect.topRight()); 
qDebug() << transform.map(rect.bottomRight()); 
qDebug() << transform.map(rect.bottomLeft()); 
qDebug() << transform.map(rect); 
qDebug() << box.polygon(); 
qDebug() << box.scenePos(); 

выходы:

QRectF(34.2629,5.75334 40.4797x55.5691) 
QTransform(type=TxProject, 11=8.39145 12=3.651e-16 13=-3.79358e-18 21=-11.232 22=1.24517 23=-0.00673223 31=731.81 32=58.3479 33=0.684533) 
QPointF(1478.33, 101.443) 
QPointF(2004.32, 101.443) 
QPointF(2466.86, 495.792) 
QPointF(1216.62, 495.792) 
QPolygonF(QPointF(1478.33, 101.443) QPointF(2004.32, 101.443) QPointF(2466.86, 495.792) QPointF(1216.62, 495.792) QPointF(1478.33, 101.443)) 
QPolygonF(QPointF(34.2629, 5.75334) QPointF(74.7427, 5.75334) QPointF(74.7427, 61.3225) QPointF(34.2629, 61.3225) QPointF(34.2629, 5.75334)) 
QPointF(1069.06, 85.2375) 

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

Однако, для всего другой матрицы преобразования я столкнулся с этим интересным результатом:

QRectF(29.8193,9.86656 29.6347x43.7413) 
QTransform(type=TxProject, 11=-4.51027 12=2.57144e-16 13=-1.00432e-19 21=7.88867 22=0.184078 23=0.00360371 31=-511.257 32=-69.1552 33=-0.353853) 
QPointF(1784.23, 211.56) 
QPointF(2204.16, 211.56) 
QPointF(2218.99, 369.009) 
QPointF(1387.07, 369.009) 
QPolygonF(QPointF(0, 0)) 
QPolygonF(QPointF(29.8193, 9.86656) QPointF(59.454, 9.86656) QPointF(59.454, 53.6079) QPointF(29.8193, 53.6079) QPointF(29.8193, 9.86656)) 
QPointF(1444.83, 195.435) 

вершина преобразуется успешно; но элемент rect не смог. Он выводит (0, 0) для преобразования.

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

С map() не работает, item.setTransform() - который, я полагаю, использует map() внутренне - также не делает. Предмет не отображается на сцене.

Для ясного видения я прикрепил вторую матрицу (транспонированную) здесь. enter image description here

Что я здесь делаю неправильно? Прецизионная ошибка? 32-разрядные вопросы?

EDIT: копать вниз source, кажется, map использует другой подход для различных типов, таких как QPointF, QLineF и т.д.

ответ

0

копания вниз bugs, похоже, отрицательное значение ж не поддерживается для преобразований, и это проблема, с которой я столкнулся, поскольку w = m13.px + m23.py + m33 отрицателен для второй матрицы.

Умножая матрицу на -1, исправлена ​​ошибка.

Qt docs действительно должен упоминать об этом.