QGraphicsView / Scene-绘制项目距离鼠标单击距离2倍

时间:2019-01-24 23:53:07

标签: c++ qt qt5 qgraphicsview qgraphicsitem

我一直在尝试使用图形视图框架在单击的位置绘制节点。但是,我找不到正确的位置。

发生此行为:我单击黄点,节点出现在那 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));
}

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

1 个答案:

答案 0 :(得分:1)

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