gpt4 book ai didi

c++ - QGraphicsView/Scene - 项目绘制距离鼠标点击 2 倍

转载 作者:行者123 更新时间:2023-11-30 04:52:28 25 4
gpt4 key购买 nike

我一直在尝试使用图形 View 框架在我点击的地方绘制节点。但是,我无法正确定位。

发生这种情况:我点击黄色点,节点出现在那里 I click on the yellow point and the node appears there.

所以这是 mainwindow.cpp 的代码:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {

scene = new GraphScene(this);
ui->setupUi(this);

ui->graphicsView->setScene(scene);
ui->graphicsView->setSceneRect(ui->graphicsView->rect());
ui->graphicsView->setFrameStyle(0);
ui->graphicsView->show();
}

自定义场景mousePressEvent:

void GraphScene::mousePressEvent(QGraphicsSceneMouseEvent *event){
if (!this->itemAt(event->scenePos(), QTransform())){
this->addItem(new NodeItem(event->scenePos()));
this->update();
}
}

和节点项:

NodeItem::NodeItem(QPointF position) {
this->setPos(position) ;
}

void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
painter->drawEllipse(pos(), 30.0, 30.0);
}

QRectF NodeItem::boundingRect() const{
return QRectF(pos(), QSizeF(30,30));
}

我尽力修复了,但我卡了一段时间,无法修复。我将不胜感激。

最佳答案

QGraphicsViewQGraphicsScene 处理不同的坐标系,在 boundingRect()paint() 的情况下他们必须在相对于项目的本地坐标中执行的方法,您不应使用 pos() 方法,因为它指的是相对于场景的坐标。

void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/){
painter->drawEllipse(boundingRect());
}

QRectF NodeItem::boundingRect() const{
return QRectF(QPointF(-15, -15), QSizeF(30,30));
}

关于c++ - QGraphicsView/Scene - 项目绘制距离鼠标点击 2 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54357122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com