首页 > 解决方案 > QGraphicsView/Scene - 项目绘制距离鼠标点击 2 倍

问题描述

我一直在尝试使用图形视图框架来绘制我单击的节点。但是,我无法获得正确的位置。

发生这种行为:我点击黄点,节点出现在那里 我点击黄点,节点出现在那里。

所以这是 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));
}

我尽力修复它,但我已经坚持了一段时间并且无法修复它。我会很感激任何帮助。

标签: c++qtqt5qgraphicsviewqgraphicsitem

解决方案


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));
}

推荐阅读