qt旋转矩形的小红点如何做到的
时间: 2024-05-24 17:13:48 浏览: 69
你可以使用QGraphicsRectItem来创建一个旋转矩形,然后使用QGraphicsRectItem的setTransformOriginPoint()方法设置旋转中心点,最后创建一个小红点QGraphicsEllipseItem,并通过setParentItem()方法将其作为QGraphicsRectItem的子项,这样就可以实现小红点跟随旋转场景了。
相关问题
qt 旋转矩形 圆 线 绘制
Qt是一款强大的GUI开发框架,它提供了许多绘制图形的函数和对象。旋转矩形、圆、线这些基本图形可以通过QPainter来绘制。
对于旋转矩形,我们可以使用QPainter的drawRect函数。如果需要进行旋转,可以调用QPainter的rotate函数进行旋转角度的设置,例如:
```
QPainter painter(this);
painter.translate(center_x, center_y);
painter.rotate(rotation_degree);
painter.drawRect(-width/2, -height/2, width, height);
```
其中,center_x和center_y是旋转矩形的中心点坐标,rotation_degree是旋转的角度,width和height是矩形的宽度和高度,-width/2和-height/2是为了让矩形中心重合。
对于绘制圆,可以使用QPainter的drawEllipse函数。同样地,可以设置圆心坐标及半径大小,例如:
```
QPainter painter(this);
painter.setPen(QPen(Qt::black, 2));
painter.drawEllipse(center_x - radius, center_y - radius, radius*2, radius*2);
```
其中,center_x和center_y是圆心坐标,radius是圆半径。setPen函数用来设置画笔颜色和线条宽度。
绘制线条可以使用QPainter的drawLine函数。可以指定起始和结束点坐标,例如:
```
QPainter painter(this);
painter.setPen(QPen(Qt::black, 2));
painter.drawLine(start_x, start_y, end_x, end_y);
```
其中,start_x和start_y是起始点坐标,end_x和end_y是结束点坐标。setPen函数同样用来设置画笔颜色和线条宽度。
总之,Qt提供了非常丰富的绘制函数和工具,我们只需要根据需求选择相应的函数进行绘制。
qt 旋转矩形,鼠标拉伸矩形框变形了
在Qt中旋转矩形可以使用QTransform类。为了在旋转后保持矩形的形状,您需要使用`QPainter::setWorldTransform()`方法将变换应用于绘制操作。然后,您可以使用鼠标事件来实现拖拽和拉伸矩形的功能。
下面是一个示例代码,展示了如何旋转矩形并实现拖拽和拉伸矩形的功能:
```cpp
#include <QtWidgets>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr)
: QWidget(parent)
{
setMouseTracking(true);
setFixedSize(400, 400);
m_rect = QRect(100, 100, 100, 50);
m_rotation = 0;
}
protected:
void paintEvent(QPaintEvent *) override
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.save();
painter.translate(m_rect.center());
painter.rotate(m_rotation);
painter.drawRect(-m_rect.width() / 2, -m_rect.height() / 2, m_rect.width(), m_rect.height());
painter.restore();
}
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
m_dragStartPosition = event->pos();
m_dragging = true;
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (m_dragging)
{
QPoint diff = event->pos() - m_dragStartPosition;
m_rect.translate(diff);
m_dragStartPosition = event->pos();
update();
}
else
{
QRect top = QRect(m_rect.x() + m_rect.width() / 4, m_rect.y() - 2, m_rect.width() / 2, 4);
QRect bottom = QRect(m_rect.x() + m_rect.width() / 4, m_rect.y() + m_rect.height() - 2, m_rect.width() / 2, 4);
QRect left = QRect(m_rect.x() - 2, m_rect.y() + m_rect.height() / 4, 4, m_rect.height() / 2);
QRect right = QRect(m_rect.x() + m_rect.width() - 2, m_rect.y() + m_rect.height() / 4, 4, m_rect.height() / 2);
if (top.contains(event->pos()))
{
setCursor(Qt::SizeVerCursor);
}
else if (bottom.contains(event->pos()))
{
setCursor(Qt::SizeVerCursor);
}
else if (left.contains(event->pos()))
{
setCursor(Qt::SizeHorCursor);
}
else if (right.contains(event->pos()))
{
setCursor(Qt::SizeHorCursor);
}
else
{
setCursor(Qt::ArrowCursor);
}
}
}
void mouseReleaseEvent(QMouseEvent *event) override
{
Q_UNUSED(event);
m_dragging = false;
}
void mouseDoubleClickEvent(QMouseEvent *event) override
{
Q_UNUSED(event);
m_rotation += 20;
update();
}
void resizeEvent(QResizeEvent *) override
{
m_rect.moveCenter(rect().center());
}
private:
QRect m_rect;
int m_rotation;
QPoint m_dragStartPosition;
bool m_dragging;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
```
此示例中,我们使用`QPainter::setWorldTransform()`方法将变换应用于绘制操作。我们还使用鼠标事件来实现拖拽和拉伸矩形的功能。在`mouseMoveEvent()`方法中,我们检查鼠标位置是否在矩形的边缘,并相应地更改光标形状。在`mouseDoubleClickEvent()`方法中,我们旋转矩形20度。