2016-12-13 12 views
0

Я хотел иметь систему онлайн-мониторинга, которая могла бы определить, где фигура в настоящее время, но я получаю очень странные координаты элемента, а также размеры его повышаются на 1 каждый раз, когда я создаю новый и перетаскиваю его.Как правильно получить позицию QGraphicsRectItem после перетаскивания?

Исходное положение (размер карты составляет 751 по 751, проверяется путем вывода на qDebug(), сцены, связанного с желтым пространства):

Initial position

перетащить его в левый верхний угол.

enter image description here

Как вы можете видеть, в начале это было на (200, 200), но после перетаскивания его на (-201; -196). Удалив его и создав новую фигуру в том же месте с теми же свойствами, новую форму нельзя увидеть, потому что она находится вне карты, что предполагает, что изменения не отображают правильные данные.

Вот код Обновление правок:

void CallableGraphicsRectItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) 
{ 
    QGraphicsRectItem::mouseReleaseEvent(event); 
    ptr->updateEdits(this); 
} 

Вот что мне удалось сократить в updateEdits():

void MainWindow::updateEdits(QAbstractGraphicsShapeItem* item) 
{ 
    //stuff not related to scene 

    auto posReal = item->scenePos(); 
    auto pos = posReal.toPoint(); 

    //create QString from coordinates 
    QString coordinate; 
    coordinate.setNum(pos.x()); 
    ui->leftXEdit->setText(coordinate); 
    coordinate.setNum(pos.y()); 
    ui->upperYEdit->setText(coordinate); 

    //get width and height for rect, radius for circle  
    auto boundingRectReal = item->sceneBoundingRect(); 
    auto boundingRect = boundingRectReal.toRect(); 
    ui->widthEdit->setText(QString::number(boundingRect.width())); 
    //disables height edit for circles, not really relevant 
    if (!items[currentShapeIndex].isRect) 
    { 
     ui->heightEdit->setDisabled(true); 
    } 
    else 
    { 
     ui->heightEdit->setDisabled(false); 
     ui->heightEdit->setText(QString::number(boundingRect.height())); 
    } 
} 

Вот как я якорь QGraphicsScene в левом верхнем углу от желтой области:

scene->setSceneRect(0, 0, mapSize.width() - 20, mapSize.height() - 20); 
ui->graphicsView->setScene(scene); 

Как я могу сообщить о ri ght данные для редактирования?

ответ

1

Вам лучше переопределить метод itemChange и использовать уведомление ItemPositionHasChanged. Вы должны установить флаг ItemSendsGeometryChanges в элементе, чтобы он получал эти уведомления.

Я не уверен, что конечная позиция вашего предмета была установлена, когда вы все еще находитесь в методе mouseReleaseEvent. Отслеживание этого в itemChange гарантирует, что данные действительны, и для этого есть то, для чего это необходимо.

Также обратите внимание, что «pos» находится в исходных координатах элемента, а «boundingRect» находится в координатном пространстве элемента. Вы должны использовать «scenePos» и «sceneBoundingRect», если хотите убедиться, что используете координаты сцены. Если элемент не имеет родителя, то «pos» и «scenePos» будут возвращать одинаковые значения, но «boundingRect» и «sceneBoundingRect» обычно будут отличаться.

+0

Я также должен отметить, что «boundingRect» и «sceneBoundingRect» будут отличаться в верхнем, левом угловых значениях, но обычно не в ширине и высоте, если у элемента нет матрицы преобразования, примененной к ней. – goug

+0

Я нашел флаг под названием 'ItemSendsScenePositionChanges'. Это лучше? – Incomputable

+0

Это не лучше; это другое. Проверьте документы на обоих флажках и посмотрите, какой из них предпочтительнее для вашей ситуации. – goug

 Смежные вопросы

  • Нет связанных вопросов^_^