QT鼠标点击,矩形旋转90度
时间: 2023-06-12 15:07:46 浏览: 193
您可以使用QGraphicsRotation来实现这个功能。首先,在您的QGraphicsItem类中定义一个QGraphicsRotation对象,然后在鼠标点击事件中将其旋转90度。
以下是一个示例代码:
```cpp
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mousePressEvent(event);
// Rotate the item by 90 degrees
QGraphicsRotation *rotation = new QGraphicsRotation(this);
rotation->setAngle(90);
this->setTransformOriginPoint(this->boundingRect().center());
this->setRotation(this->rotation() + 90);
}
```
在这个示例中,我们在鼠标点击事件中创建了一个QGraphicsRotation对象,并将其角度设置为90度。然后,我们将该对象的变换原点设置为矩形的中心,并将矩形本身旋转90度。
请注意,这只是一个示例代码,您需要根据您的实际需求进行调整。
相关问题
qt在场景中旋转矩形,鼠标拉伸矩形变形了
你可以通过设置 QGraphicsItem 的旋转和变形来实现在场景中旋转和变形矩形。以下是一个简单的示例代码:
```python
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QTransform
from PyQt5.QtWidgets import QGraphicsRectItem
class MyRectItem(QGraphicsRectItem):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setFlags(QGraphicsRectItem.ItemIsMovable |
QGraphicsRectItem.ItemIsSelectable |
QGraphicsRectItem.ItemSendsGeometryChanges)
self.setAcceptHoverEvents(True)
self.setTransformOriginPoint(self.boundingRect().center())
def hoverMoveEvent(self, event):
if self.isSelected():
if event.modifiers() == Qt.ShiftModifier:
self.setRotation(self.rotation() + 5)
else:
super().hoverMoveEvent(event)
def itemChange(self, change, value):
if change == QGraphicsRectItem.ItemRotationHasChanged:
self.setTransform(QTransform().rotate(self.rotation()), True)
elif change == QGraphicsRectItem.ItemTransformHasChanged:
self.setRotation(self.transform().rotation())
return super().itemChange(change, value)
```
在这个示例中,我们继承了 QGraphicsRectItem 类,并在其基础上实现了旋转和变形的功能。我们使用 setFlags() 方法设置了可移动、可选中和发送几何变化通知的标志,以便我们可以在场景中拖动和选择矩形。
我们还使用 setAcceptHoverEvents() 方法启用了鼠标悬停事件的处理,以便我们可以在选择矩形的同时进行旋转操作。在 hoverMoveEvent() 方法中,我们检查当前是否按下 Shift 键,如果是,则逆时针旋转矩形 5 度。
在 itemChange() 方法中,我们捕获了矩形的旋转和变形事件,并使用 setTransform() 和 setRotation() 方法进行相应的变换。注意,为了确保矩形的变形和旋转相对于其中心进行,我们使用 setTransformOriginPoint() 方法设置了变换的原点为矩形的中心点。
这样,你就可以在场景中旋转和变形矩形了。
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度。
阅读全文
相关推荐














