【问题标题】:QGraphicsView/Scene - items are drawn 2x away from mouse clickQGraphicsView/Scene - 项目绘制距离鼠标点击 2 倍
【发布时间】:2019-06-18 19:22:10
【问题描述】:

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

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

这是 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++ qt qt5 qgraphicsview qgraphicsitem


    【解决方案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));
    }
    

    【讨论】:

    • @HajAyedAmir 检查我的更新,这是对之前版本的改进。
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多