我在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。)
没有旋转和翻译,代码工作正常并绘制形状。使用当前代码仅显示矩形,而不是多边形。如何旋转这些形状?
答案 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);
没有转换:
通过转换:
答案 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();