问题描述
我在 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);
}