qt 6.7 使用QGraphicsRectItem绘制一个矩形,提供完整代码

在Qt 6.7中,使用QGraphicsRectItem来绘制一个矩形通常涉及到QGraphicsSceneQGraphicsView。以下是一个简单的示例代码,展示了如何创建一个矩形项并将其添加到场景中:

步骤概览

  1. 创建QGraphicsScene对象:这是所有图形项的容器。
  2. 创建QGraphicsRectItem对象:代表要绘制的矩形。
  3. 将矩形项添加到场景中
  4. 创建QGraphicsView对象:用于显示场景的窗口。
  5. 将场景设置为视图的场景
  6. 显示视图

示例代码

#include <QApplication>  
#include <QGraphicsScene>  
#include <QGraphicsView>  
#include <QGraphicsRectItem>  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 1. 创建QGraphicsScene对象  
    QGraphicsScene scene;  
  
    // 2. 创建QGraphicsRectItem对象  
    QGraphicsRectItem *rectItem = new QGraphicsRectItem();  
    rectItem->setRect(50, 50, 100, 100); // 设置矩形的位置和大小  
  
    // 3. 将矩形项添加到场景中  
    scene.addItem(rectItem);  
  
    // 4. 创建QGraphicsView对象  
    QGraphicsView view;  
  
    // 5. 将QGraphicsScene设置为QGraphicsView的场景  
    view.setScene(&scene);  
    view.setRenderHint(QPainter::Antialiasing); // 设置反锯齿渲染  
  
    // 6. 显示视图  
    view.show();  
  
    return app.exec();  
}

这段代码创建了一个简单的Qt应用程序,其中包含一个QGraphicsScene和一个QGraphicsView。在场景中,我们添加了一个QGraphicsRectItem,表示一个矩形。矩形的位置和大小通过setRect()方法设置。最后,我们通过调用view.show()来显示视图。

请注意,为了运行此代码,你需要有一个正确配置的Qt 6.7开发环境,并且需要将此代码放置在适当的Qt项目结构中。

设置QGraphicsRectItem在QGraphicsScene中的位置 

设置QGraphicsRectItemQGraphicsScene中的位置,可以通过以下步骤进行:

  1. 创建QGraphicsRectItem对象
    首先,需要创建一个QGraphicsRectItem对象。这个对象代表了你想要在场景中绘制的矩形。

  2. 设置矩形的位置和尺寸
    使用QGraphicsRectItemsetRect方法来定义矩形的位置和尺寸。这个方法接受四个参数:矩形的左上角x坐标、左上角y坐标、矩形的宽度和高度。例如,rectItem->setRect(50, 50, 100, 100);会将矩形的左上角设置为(50, 50),并设置其宽度和高度分别为100。

  3. 将QGraphicsRectItem添加到QGraphicsScene中
    在创建了QGraphicsRectItem并设置了其位置和尺寸后,需要将其添加到QGraphicsScene中。这可以通过调用QGraphicsSceneaddItem方法实现,如scene.addItem(rectItem);

  4. 调整QGraphicsRectItem的位置(可选)
    如果在将矩形项添加到场景后需要调整其位置,可以使用QGraphicsItemsetPos方法。例如,rectItem->setPos(newX, newY);会将矩形项移动到新的位置(newX, newY)。

  5. 在QGraphicsView中显示QGraphicsScene
    最后,为了能够在窗口中看到QGraphicsScene及其包含的QGraphicsRectItem,需要将场景设置到QGraphicsView中,并显示这个视图。这可以通过view.setScene(&scene);view.show();实现。

总结来说,设置QGraphicsRectItemQGraphicsScene中的位置主要涉及到创建矩形项、设置其位置和尺寸、将其添加到场景中,并可选地在添加后调整其位置。最后,通过QGraphicsView来显示整个场景及其内容。

 // 2. 创建QGraphicsRectItem对象 QGraphicsRectItem *rectItem = new QGraphicsRectItem(); rectItem->setRect(0, 0, 100, 100); // 设置矩形的位置和大小 这里我将setRect(0, 0, 100, 100); 修改位setRect(50, 50, 100, 100);矩形的位置没有变化,为什么

当你使用setRect方法时,你实际上是在定义矩形的大小和相对于矩形自身左上角的“内部”位置,而不是在场景中的绝对位置。换句话说,setRect(50, 50, 100, 100)并不意味着矩形会被放置在场景的(50,50)位置,而是定义了一个宽度为100、高度为100的矩形,其左上角的“内部”坐标是(50,50)。但这并不改变矩形在QGraphicsScene中的“外部”位置。

如果你想要改变QGraphicsRectItemQGraphicsScene中的位置,你应该使用setPos方法来设置矩形项在场景中的位置。例如:

rectItem->setPos(50, 50); // 这会将矩形项移动到场景的(50,50)位置

因此,如果你想要创建一个位于场景(50,50)位置、宽度和高度都为100的矩形,你应该先使用setRect(0, 0, 100, 100)来定义矩形的大小,然后使用setPos(50, 50)来设置其在场景中的位置。

希望这解释清楚了你的问题,并帮助你正确地设置QGraphicsRectItem的位置。

我使用rectItem->setPos(50, 50);也无法改变位置,且无论设置任何值,位置都是在左上角的位置 

你提到即使使用了rectItem->setPos(50, 50);也无法改变QGraphicsRectItem的位置,这可能是由于几个原因造成的。为了更准确地诊断问题,我需要查看包含setPos调用的完整代码段。然而,在这里我可以提供一些可能导致这个问题的常见原因和解决方案:

  1. 确保矩形项已添加到场景中:在调用setPos之前,请确认你已经使用scene.addItem(rectItem);将矩形项添加到了场景中。

  2. 检查坐标系统:确认你的场景和视图的坐标系统是一致的。有时候,视图的变换或缩放设置可能会影响显示的位置。

  3. 视图配置:确保你的QGraphicsView已经正确配置了场景,并且没有被其他设置(如缩放、平移等)影响。

  4. 代码顺序:检查setPos调用的位置是否在添加矩形项到场景之后。如果在添加之前调用setPos,则可能看不到预期的效果。

  5. 其他代码干扰:确认在调用setPos之后没有其他代码重置了矩形项的位置。

如果你能提供一段包含setPos调用的完整代码,我可以更具体地帮助你诊断问题。同时,请检查上述可能的原因,并尝试调整代码以确保setPos能够正确设置矩形项的位置。

最终代码与运行效果

代码

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 1. 创建QGraphicsScene对象
    QGraphicsScene scene;

    // 2. 创建QGraphicsRectItem对象
    QGraphicsRectItem *rectItem = new QGraphicsRectItem();
    rectItem->setRect(0, 0, 100, 100); // 设置矩形的位置和大小


    // 3. 将矩形项添加到场景中
    scene.addItem(rectItem);

    // 4. 创建QGraphicsView对象
    QGraphicsView view;
    view.setAlignment(Qt::AlignLeft | Qt::AlignTop);
    view.setGeometry(0,0,500,400);

    // 5. 将QGraphicsScene设置为QGraphicsView的场景
    view.setScene(&scene);
    view.setRenderHint(QPainter::Antialiasing); // 设置反锯齿渲染

    rectItem->setPos(100,100);

    // 6. 显示视图
    view.show();

    return app.exec();
}

运行结果 

 rectItem->setRect(50,50, 100, 100); 这里的50,50,如果改变,并不改变矩形在画面中的实际位置,是什么原因呢

在 Qt 的 QGraphicsItem 框架中,setRect 方法和 setPos 方法分别控制不同的属性。

  • setRect(x, y, width, height):这个方法定义的是图形项自身的局部坐标系中的矩形区域。这里的 x 和 y 指定的是矩形左上角在其自身坐标系中的位置,而不是在场景(QGraphicsScene)中的绝对位置。改变 setRect 中的 x 和 y 值通常不会影响图形项在场景中的位置,而是会改变图形项内部矩形的相对位置。然而,在大多数情况下,QGraphicsRectItem 的矩形是从 (0, 0) 开始的,因此改变 setRect 中的 x 和 y 可能看起来没有效果,除非你在图形项内部进行了更复杂的变换或组合。

  • setPos(x, y):这个方法用于设置图形项在场景中的绝对位置。这里的 x 和 y 是相对于场景坐标系的。因此,如果你想要移动 QGraphicsRectItem 在场景中的位置,你应该使用 setPos 方法。

总结一下,rectItem->setRect(50,50, 100, 100); 中的 50, 50 是矩形在其自身坐标系中的位置,如果你没有看到矩形在场景中移动,那是因为这行代码并没有改变矩形项在场景中的绝对位置。要移动矩形项在场景中的位置,你需要使用 rectItem->setPos(newX, newY);,其中 newX 和 newY 是你在场景中希望矩形出现的位置。

如果你想要矩形从自身的 (50, 50) 开始(虽然这通常不是必需的),并且希望它在场景中的某个特定位置,你需要同时使用 setRect 和 setPos。例如:

rectItem->setRect(50, 50, 100, 100); // 设置矩形的内部位置和大小
rectItem->setPos(100, 100); // 设置矩形在场景中的位置

在这个例子中,矩形的左上角会在其自身坐标系中的 (50, 50) 位置开始,但是整个矩形项会被放置在场景的 (100, 100) 位置。不过,请注意,通常我们设置矩形时都是从 (0, 0) 开始,即 rectItem->setRect(0, 0, 100, 100);,然后使用 setPos 来控制其在场景中的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值