在Graphicsview中绘制矩形
时间: 2024-10-27 18:09:52 浏览: 82
在Qt的GraphicsView框架中,要绘制一个矩形,你可以通过创建`QPainterPath`,添加矩形路径元素,然后将这个路径传递给`QGraphicsScene`或`QGraphicsView`的相关绘画函数。以下是简单的步骤:
1. 创建一个`QGraphicsRectItem`:这是Qt提供的用于直接表示图形场景中的矩形的预设元素,可以直接添加到`QGraphicsScene`中。
```cpp
QGraphicsRectItem *rect = new QGraphicsRectItem(QRectF(x, y, width, height), scene);
```
这里,x, y是你想要矩形左上角的坐标,width和height是矩形的尺寸。
2. 如果你想手动绘制,可以创建`QPainterPath`并添加矩形:
```cpp
QPainterPath path;
path.addRect(QRectF(x, y, width, height));
scene->addPath(path, brush); // brush是填充颜色或样式
```
3. 使用`QPainter`进行绘图,通常在`paintEvent()`这样的绘画事件处理函数中:
```cpp
void MyView::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPath(path);
}
```
相关问题
opentk绘制矩形
要使用 OpenTK 绘制矩形,你可以使用 OpenGL 的基本绘图功能。下面是一个使用 OpenTK 绘制矩形的示例代码:
```csharp
using OpenTK;
using OpenTK.Graphics.OpenGL;
public class RectangleRenderer : GameWindow
{
public RectangleRenderer() : base(800, 600)
{
VSync = VSyncMode.On;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
GL.ClearColor(Color.CornflowerBlue);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
GL.Viewport(0, 0, Width, Height);
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(0, Width, 0, Height, -1, 1);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
GL.Begin(PrimitiveType.Quads);
GL.Color3(Color.Red);
GL.Vertex2(100, 100); // Top-left
GL.Vertex2(200, 100); // Top-right
GL.Vertex2(200, 200); // Bottom-right
GL.Vertex2(100, 200); // Bottom-left
GL.End();
SwapBuffers();
}
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
if (Keyboard[OpenTK.Input.Key.Escape])
{
Exit();
}
}
public static void Main()
{
using (RectangleRenderer rectangleRenderer = new RectangleRenderer())
{
rectangleRenderer.Run(60);
}
}
}
```
在上述代码中,我们创建了一个名为 `RectangleRenderer` 的类,继承自 `GameWindow`。在 `OnLoad` 方法中,我们设置了清除颜色。在 `OnResize` 方法中,我们设置了视图矩阵,使用正交投影来适应窗口大小。在 `OnRenderFrame` 方法中,我们使用 `GL.Begin` 和 `GL.End` 来绘制矩形的四个顶点。我们使用 `GL.Vertex2` 来指定每个顶点的坐标。在 `OnUpdateFrame` 方法中,我们检查按下的键盘按键,如果按下了 Escape 键,则退出应用程序。
在 `Main` 方法中,我们创建了一个 `RectangleRenderer` 的实例,并调用 `Run` 方法来运行应用程序。
请确保你的项目引用了 OpenTK 库,并且在项目属性的 "生成" 选项卡中设置了 "平台目标" 为 x86 或 x64,以匹配你的系统架构。
pyqt5 self.graphicsView 增加框选矩形,并返回实际坐标
您好!要在 PyQt5 的 graphicsView 中增加框选矩形,可以使用 QGraphicsScene 中的 selectionChanged 信号和 QGraphicsView 中的 rubberBandChanged 信号来实现。
具体地,可以在 rubberBandChanged 信号中获取 rubber band 的矩形区域,然后将其转换为场景坐标系中的矩形。代码如下:
```python
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QRubberBand
from PyQt5.QtCore import Qt
class MyGraphicsView(QGraphicsView):
def __init__(self, parent=None):
super(MyGraphicsView, self).__init__(parent)
self.setDragMode(QGraphicsView.RubberBandDrag)
self.setRubberBandSelectionMode(Qt.IntersectsItemShape)
self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
self.rubberBandChanged.connect(self.onRubberBandChanged)
self.selectionChanged.connect(self.onSelectionChanged)
def onRubberBandChanged(self, rect, fromScenePoint, toScenePoint):
# 将 rubber band 的矩形区域转换为场景坐标系中的矩形
rect = self.mapToScene(rect).boundingRect()
print('rubber band:', rect)
def onSelectionChanged(self):
# 清空 rubber band
self.rubberBand.hide()
def mousePressEvent(self, event):
# 显示 rubber band
if event.button() == Qt.LeftButton:
self.rubberBand.show()
self.rubberBand.setGeometry(event.pos().x(), event.pos().y(), 0, 0)
self.rubberBand.setFixedWidth(0)
self.rubberBand.setFixedHeight(0)
super(MyGraphicsView, self).mousePressEvent(event)
```
在这个例子中,我们创建了一个 MyGraphicsView 类,继承自 QGraphicsView。在构造函数中,我们设置了拖拽模式为 RubberBandDrag,并将 rubber band 的选择模式设置为 IntersectsItemShape。然后我们创建了一个 QRubberBand 对象用于绘制 rubber band,同时连接了 rubberBandChanged 和 selectionChanged 信号到对应的槽函数中。
在 onRubberBandChanged 槽函数中,我们将 rubber band 的矩形区域使用 mapToScene 方法转换为场景坐标系中的矩形,并输出到控制台中。
在 onSelectionChanged 槽函数中,我们隐藏 rubber band。
最后,在 mousePressEvent 中,我们显示 rubber band,并设置其初始位置和大小。
希望对您有所帮助!
阅读全文
相关推荐
















