在 QGraphicsScene 上绘制 QGraphicsItem 的正确方法

问题描述

我在 qt 的网站和此处查看了一些资源,但无法解决我的问题。

我正在尝试在鼠标单击时在 QGraphicsScene 上绘制一个矩形,我希望新矩形正好在用户单击的位置居中,但这在场景足够大之前不起作用。

这是我尝试过的

function loadScript(scriptUrl1,scriptUrl2,retries = 4) { const getScript= document.createElement("script"); getScript.onerror = () => { if (retries > 0) { loadScript(scriptUrl1,retries - 1); } else { console.log("Failed to load") } } script1.src = scriptUrl1; script2.src = scriptUrl2; }

MainWindow.cpp

并在MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); = ui->graphView->setContextMenuPolicy(Qt::CustomContextMenu); scene = new QGraphicsScene(); ui->graphView->setScene(scene); ... } void MainWindow::on_graphView_customContextMenuRequested(const QPoint &pos) { auto pp= ui->graphView->mapToScene(pos); tableOfRectangles.push_back( new component(pp,s,n,t)); //component is my class that inherits from qgraphicsitem scene->addItem(tableOfRectangles[tableOfRectangles.size()-1]); }

compenent.cpp

我的问题是:

一个矩形绘制在中间,随着我向正确位置添加的越多,继续稍微移动。通过添加更多矩形(或拖动现有矩形)使场景足够大(当滚动条开始出现时),新矩形会在鼠标位置正确添加。但是我如何强制它们从一开始就插入到正确的位置?

解决方法

您正在将相对于项目的 boundingRect 坐标与相对于场景的坐标结合起来。另一方面,不要使创建自定义项复杂化,而是使用自定义 QGraphicsRectItem。最后建议你建立一个sceneRect。

component.h

#ifndef COMPONENT_H
#define COMPONENT_H

#include <QGraphicsRectItem>

class Component : public QGraphicsRectItem
{
public:
    Component(unsigned int id,QString cname,QString ctype,QGraphicsItem *parent=nullptr);
private:
    unsigned int m_id;
    QString m_cname;
    QString m_ctype;
};

#endif // COMPONENT_H

component.cpp

#include "component.h"

Component::Component(unsigned int id,QGraphicsItem*parent):
    QGraphicsRectItem(parent),m_id(id),m_cname(cname),m_ctype(ctype)
{
    setRect(-40,-40,80,80);
    setFlag(ItemIsMovable);
}
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->graphView->setContextMenuPolicy(Qt::CustomContextMenu);
    scene = new QGraphicsScene();
    ui->graphView->setScene(scene);
    ui->graphView->setSceneRect(QRect(0,400,400));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_graphView_customContextMenuRequested(const QPoint &pos)
{

    QPointF pp = ui->graphView->mapToScene(pos);
    Component* component = new Component(s,n,t);
    scene->addItem(component);
    component->setPos(pp);
}