Results 1 to 3 of 3

Thread: Rotation Problem

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Aug 2008
    Location
    Ukraine, Krivoy Rog
    Posts
    1,963
    Thanked 370 Times in 336 Posts
    Qt products
    Qt3 Qt4 Qt5
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Rotation Problem

    Can you disclose you code snippet in CODE tags? It's really hard to read it.
    Qt Assistant -- rocks!
    please, use tags [CODE] & [/CODE].

  2. #2
    Join Date
    Sep 2009
    Posts
    26
    Thanked 1 Time in 1 Post
    Qt products
    Qt4
    Platforms
    Unix/X11

    Default Re: Rotation Problem

    Qt Code:
    1. QRectF CRectangle::getUntransformedRect(QPainter *painter, QRectF rect)
    2. {
    3. if (!painter->transform().isScaling()/* || scaleFactor < 1*/)
    4. return rect;
    5.  
    6. QTransform transform = painter->transform();
    7. QRectF transFormedRect = transform.mapRect(rect);
    8. float scaleFactor = transFormedRect.width() / rect.width();
    9.  
    10. QRectF destRect = rect;
    11. destRect.setWidth(rect.width() / scaleFactor);
    12. destRect.setHeight(rect.height() / scaleFactor);
    13. destRect.moveCenter(rect.center());
    14. return destRect;
    15. }
    16.  
    17. void CRectangle::updateAngleHandle()
    18. {
    19. if(m_ShowRotation)
    20. {
    21. m_RotateLine.setP1(m_Handles[7].center());
    22. float size = m_ActualRectangle.width();
    23. m_RotateLine.setP2(QPointF(m_Handles[7].center().x() + (size / 4), m_Handles[7].center().y()));
    24. QPointF point = m_RotateLine.p2();
    25.  
    26. QPointF destArrowP1 = point;
    27. destArrowP1.setY(point.y() + 8.0);
    28. destArrowP1.setX(point.x() - 8.0);
    29. QPointF destArrowP2 = destArrowP1;
    30. destArrowP2.setY(point.y() - 8);
    31.  
    32. int points[] = {point.x(), point.y(), destArrowP1.x(), destArrowP1.y(), destArrowP2.x(), destArrowP2.y()};
    33. m_AngleHandle.setPoints(3, points);
    34. }
    35. }
    36.  
    37.  
    38. void CRectangle::drawShape(QPainter *painter)
    39. {
    40. if(!m_ActualRectangle.isEmpty() && m_Show)
    41. {
    42. painter->setPen(m_DrawingPen);
    43. painter->setBrush(QColor(0, 0, 0, 0));
    44. painter->save();
    45. //painter->setTransform(m_transform);
    46. QTransform transform = painter->transform();
    47. QPointF centerPoint = m_transform.map(m_ActualRectangle.center());
    48. transform.translate(centerPoint.x(), centerPoint.y());
    49. transform.rotate(-m_Angle);
    50. transform.translate(-centerPoint.x(), -centerPoint.y());
    51. painter->setTransform(transform);
    52. painter->drawRect(m_ActualRectangle);
    53.  
    54. if(m_NeedCenterCross)
    55. {
    56. painter->drawLines(m_CenterCrossLine);
    57. }
    58. if(m_ShowHandles && m_Enable)
    59. {
    60. //drawing resizable handles
    61.  
    62. painter->setPen(QColor(255, 255, 255));
    63. painter->setBrush(Qt::black);
    64.  
    65. Q_FOREACH( QRectF rect , m_Handles) /// This is for drawing resizable handles
    66. {
    67. QRectF notTransformedRect = getUntransformedRect(painter, rect);
    68. painter->drawRect(notTransformedRect);
    69. }
    70.  
    71. //painter->restore();
    72.  
    73.  
    74. //painter->drawText(m_Handles[i].topLeft(), QString::number(i));
    75.  
    76. if(m_ShowRotation) // For Arrow Handle
    77. {
    78. m_RotateLine.setP1(m_Handles[7].center());
    79. float size = m_ActualRectangle.width();
    80. m_RotateLine.setP2(QPointF(m_Handles[7].center().x() + (size / 4), m_Handles[7].center().y()));
    81. QPointF point = m_RotateLine.p2();
    82.  
    83. QPointF destArrowP1 = point;
    84. destArrowP1.setY(point.y() + 8.0);
    85. destArrowP1.setX(point.x() - 8.0);
    86. QPointF destArrowP2 = destArrowP1;
    87. destArrowP2.setY(point.y() - 8);
    88.  
    89. QRectF angleRect(destArrowP2, QSizeF(point.x() - destArrowP2.x(), destArrowP1.y() - destArrowP2.y()));
    90. QRectF angleRectUnScaled = getUntransformedRect(painter, angleRect);
    91.  
    92. point.setX(angleRectUnScaled.topRight().x());
    93. point.setY(angleRectUnScaled.center().y());
    94.  
    95. destArrowP1 = angleRectUnScaled.bottomLeft();
    96. destArrowP2 = angleRectUnScaled.topLeft();
    97.  
    98. int points[] = {point.x(), point.y(), destArrowP1.x(), destArrowP1.y(), destArrowP2.x(), destArrowP2.y()};
    99. m_AngleHandle.setPoints(3, points);
    100.  
    101. QPen pen;
    102. pen.setColor(m_DrawingPen.color());
    103. painter->setPen(pen);
    104. painter->setBrush(Qt::black);
    105. painter->drawLine(m_RotateLine);
    106. painter->drawPolygon(m_AngleHandle);
    107. }
    108. }
    109. else
    110. {
    111. painter->restore();
    112. }
    113. painter->restore();
    114.  
    115. if(m_Failed)
    116. {
    117. painter->setPen(QColor(Qt::red));
    118. painter->drawLine(m_transform.map(m_Handles[0].topLeft()), m_transform.map(m_Handles[4].topLeft()));
    119. painter->drawLine(m_transform.map(m_Handles[2].topLeft()), m_transform.map(m_Handles[6].topLeft()));
    120. }
    To copy to clipboard, switch view to plain text mode 

Similar Threads

  1. 3d rotation transformation
    By feverzsj in forum Qt Programming
    Replies: 0
    Last Post: 24th November 2010, 02:44
  2. Problem with rotation of QGraphicsItem
    By ashishsaryar in forum Qt Programming
    Replies: 2
    Last Post: 10th July 2008, 15:03
  3. Rotation on Qframe
    By Pharell in forum Qt Programming
    Replies: 11
    Last Post: 2nd April 2008, 16:31
  4. Rotation problem trying to draw a compass widget
    By yellowmat in forum Qt Programming
    Replies: 2
    Last Post: 18th February 2007, 19:03
  5. Rotation problem
    By boss_bhat in forum Qt Programming
    Replies: 5
    Last Post: 17th January 2007, 16:46

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.