Qt旋转形状

时间:2017-09-12 15:01:58

标签: c++ qt rotation

我在Qt中尝试绘制和旋转形状,但我真的不知道它是如何工作的。目前我的代码绘制了一个矩形,顶部有一个小三角形。我想将形状旋转35度,所以我试试这个:

void Window::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QBrush brush;
    brush.setStyle(Qt::SolidPattern);
    brush.setColor(Qt::white);
    painter.setBrush(brush);
    painter.setPen(Qt::NoPen);
    painter.fillRect(0,0,800,800,brush);
    brush.setColor(Qt::red);
    painter.translate(s.getX()-5,s.getY()-8);
    painter.rotate(35);
    painter.fillRect(0,0,10,16,brush);
    QPolygon pol;
    pol.setPoints(3,0,0,10,0,5,10);
    QPainterPath p;
    p.addPolygon(pol);
    painter.fillPath(p,brush);
}

(忽略s.getX/Y()来电,目前x为150,y为750。)

没有旋转和翻译,代码工作正常并绘制形状。使用当前代码仅显示矩形,而不是多边形。如何旋转这些形状?

2 个答案:

答案 0 :(得分:1)

您需要正确理解affine transformations的工作原理。如果没有正确的理解,你将很难实现所需的目标。

  • rotate围绕坐标中心旋转所有内容:(0,0)
  • translate将坐标中心移动到新位置

您的代码会围绕点(s.getX() - 5, s.getY() - 8)旋转所有内容。

所以这里的代码将两个形状围绕红色矩形的中心旋转35度:

QPainter painter(this);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
brush.setColor(Qt::white);
painter.setBrush(brush);
painter.setPen(Qt::NoPen);
painter.fillRect(0, 0, 800, 800, brush);
brush.setColor(Qt::red);
painter.translate(150, 750);

painter.translate(5, 8); // move center of coordinates to the center of red rectangle
painter.rotate(35); // rotate around the center of red rectangle
painter.translate(-5, -8); // move center of coordinates back to where it was

painter.fillRect(0, 0, 10, 16, brush);
QPolygon pol;
pol.setPoints(3, 0, 0, 10, 0, 5, 10);
QPainterPath p;
p.addPolygon(pol);
brush.setColor(Qt::blue);
painter.fillPath(p, brush);

没有转换:

  

enter image description here

通过转换:

  

enter image description here

答案 1 :(得分:0)

@AMA 感谢您的带头。 我正在绘制一个箭头小部件,然后尝试以配置的角度旋转它。 我完成了,这是我的paintEvent代码:

QPainter painter(this);
this->resize(getNHeightWidth(),getNHeightWidth());

//Drawing triangle START
QRect Rect = QRect(0, 0, getNHeightWidth(), getNHeightWidth());
QPainterPath m_RectPath;
m_RectPath.moveTo(Rect.right()-3, (Rect.width()/2));
m_RectPath.lineTo(Rect.left()+5, Rect.top()+5);
m_RectPath.lineTo(Rect.left()+5, Rect.bottom()-5);
m_RectPath.lineTo(Rect.right()-3, (Rect.width()/2));
//Drawing triangle END

//Rotating
painter.translate(getNHeightWidth()/2, getNHeightWidth()/2);
painter.rotate(m_nOrientation);
painter.translate(-getNHeightWidth()/2, -getNHeightWidth()/2);
painter.fillPath(m_RectPath, QBrush(Qt::white));  //Finally Drawing
painter.resetTransform();

//Masking
QRegion Mask(Rect);
setMask(Mask);
painter.end();