QGraphicsItem setPos не перемещает позицию элемента - PullRequest
0 голосов
/ 14 октября 2011

То, что у меня есть, похоже на следующее:

int main(int argc, char **argv) {
  QApplication app(argc, argv);
  MainWindow appWindow;
  appWindow.show();
  return app.exec();
}
class MainWindow : public QMainWindow {
  ...
private:
  QGraphicsScene *mScene;
  QGraphicsView *mView;
  QGraphicsItem *mItem;
  QPushButton *mButton1, *mButton2;
};
MainWindow::MainWindow(...) {
  mScene = new QGraphicsScene(this);
  mScene->setItemIndexMethod(QGraphicsScene::NoIndex);
  mView = new QGraphicsView(mScene, this);
  mView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
  mButton1 = new QPushButton("Create Item", this);
  QObject::connect(mButton1, SIGNAL(clicked()), ...);
  mButton2 = new QPushButton("Set Item Position");
  QObject::connect(mButton2, SIGNAL(clicked()), ...);
}
void MainWindow::button1Clicked() {
  mItem = new QGraphicsSimpleTextItem("Test Item");
  mItem->setPos(mItem->pos() + QPointF(7.0f, 7.0f));  // doesn't work
  mScene->addItem(mItem);

  // even when I move the setPos() call after QGraphicsScene::addItem,
  // the item still paints at the top-left corner (0.0f, 0.0f)
}
void MainWindow::button2Clicked() {
  mItem->setPos(mItem->pos() + QPointF(7.0f, 7.0f)); // works perfect
}

Я очень плохо знаком с Qt и, скорее всего, неправильно понимаю основную концепцию. Кто-нибудь может заметить, что я здесь делаю неправильно?

1 Ответ

5 голосов
/ 14 октября 2011

С QGraphicsView doc:

Отображаемая область по умолчанию определяется автоматически при первом отображении представления (путем вызова QGraphicsScene :: itemsBoundingRect ()).

Это означает, что при первом отображении представления в качестве границ используются объединенные границы элемента.Поэтому, когда вы впервые добавили элемент, какой бы ни была позиция элемента, он будет использоваться как верхний левый угол отображаемой сцены.Таким образом, ваш элемент фактически перемещен, но сцена показана со смещением.Похоже, что это в (0, 0).И когда вы перемещаете его во второй раз, он фактически уже перемещен дважды.

Решение состоит в том, чтобы установить seceneRect на известный прямоугольник, прежде чем показывать его.Это исправит отображаемую область.

...