0

私が持っているものは次のようなものです:

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に非常に慣れていないので、基本的な概念を誤解している可能性があります。誰かが私がここで間違っていることを見つけることができますか?

4

1 に答える 1

5

QGraphicsViewドキュメントから:

視覚化された領域は、ビューが初めて表示されるときにデフォルトで自動的に検出されます (QGraphicsScene::itemsBoundingRect() を呼び出すことにより)。

つまり、ビューが最初に表示されるとき、結合されたアイテムの境界がその境界として使用されます。そのため、アイテムを最初に追加したとき、アイテムの位置に関係なく、表示されたシーンの左上として使用されます。したがって、アイテムは実際に移動しますが、シーンはオフセットで表示されます。つまり、(0, 0) にあるように見えます。2 回目に移動すると、実際には 2 回移動しています。

解決策は、seceneRect表示する前に を既知の rect に設定することです。これにより、表示領域が修正されます。

于 2011-10-14T01:24:10.297 に答える