Я хотел иметь систему онлайн-мониторинга, которая могла бы определить, где фигура в настоящее время, но я получаю очень странные координаты элемента, а также размеры его повышаются на 1 каждый раз, когда я создаю новый и перетаскиваю его.Как правильно получить позицию QGraphicsRectItem после перетаскивания?
Исходное положение (размер карты составляет 751 по 751, проверяется путем вывода на qDebug()
, сцены, связанного с желтым пространства):
перетащить его в левый верхний угол.
Как вы можете видеть, в начале это было на (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 данные для редактирования?
Я также должен отметить, что «boundingRect» и «sceneBoundingRect» будут отличаться в верхнем, левом угловых значениях, но обычно не в ширине и высоте, если у элемента нет матрицы преобразования, примененной к ней. – goug
Я нашел флаг под названием 'ItemSendsScenePositionChanges'. Это лучше? – Incomputable
Это не лучше; это другое. Проверьте документы на обоих флажках и посмотрите, какой из них предпочтительнее для вашей ситуации. – goug