QGraphicsView / Scene - элементы отрисовываются в 2 раза дальше от щелчка мышью - PullRequest
0 голосов
/ 25 января 2019

Я пытался использовать каркас графического представления для рисования узлов, где я нажимаю. Тем не менее, я не могу получить правильную позицию.

Такое поведение происходит: я нажимаю на желтую точку, и там появляется узел 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 голосов
/ 25 января 2019

QGraphicsView и QGraphicsScene обрабатывают различные системы координат, в случае методов 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));
}
...