2013-07-05 102 views
0

我正在開發一個程序,以允許用戶選擇一個文件並將其添加到QGraphicsView。除了項目定位之外,所有的esle都能正常工作所有圖像顯示在相同的位置。源代碼如下將圖像添加到QGraphicsScene中的某個位置

//user action to add an image 
    void MainWindow::on_actionMessage_triggered() 
    { 
     const int width = 150; 
     const int height = 200; 

     QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath()); 

      QImage image(fileName); 
      QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image)); 
      item->setScale(0.1); 
      item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); 
      item->setPos(scene->items.count()*width,scene->items.count()*height); 
      scene->addItem(item); 
    } 


//initialize Scene 
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
    { 
     ui->setupUi(this); 
     this->setBaseSize(800, 600); 

     scene = new QGraphicsScene(0,0,600,400); 
     scene->setSceneRect(0,0,600,400); 

     ui->graphicsView->setScene(scene); 
     //ui->graphicsView->fitInView(scene.sceneRect()); 
     ui->graphicsView->show(); 
    } 
+0

'scene-> items.count()'無效。它應該是'scene-> items()。count()'。這是真的嗎? –

+0

更改了代碼。但結果是一樣的。 – lonelyloner

+1

你是什麼意思的「相同」? 'scene-> items.count()'不能編譯!你怎麼能不注意到這一點?我已經運行你的代碼,它對我來說工作得很好。我認爲您的構建系統存在問題(例如,項目在運行之前不會編譯)。 –

回答

1

當使用QGraphicsSystem時,您需要考慮設置和檢索項目位置時影響哪個座標系。

在這種情況下,一個項目沒有父母,而Qt文檔指出,沒有父母它將設置該項目的場景座標,這將需要知道場景做你的期望。

因此,在調用setPos之前將該項添加到場景中。

+0

嘗試過,仍然沒有運氣 – lonelyloner

+0

在addItem工作正常之前使用'setPos'。 Qt文檔確實不清楚它,但似乎項目位置存儲在項目對象中,並在添加到場景時應用到它。 –

+0

我以前在設置位置時遇到過問題,但可能已經修復。我會多想一想這個問題。 – TheDarkKnight

0

嘗試使用mapToscene函數。例如:mapToscene(位置座標)它肯定會工作。

0

我在這裏分享了工作代碼。

https://stackoverflow.com/a/45280054/1999190

另外,如果你想在頂部的默認位置,而不是中心,只需更改graphicsView的對齊。

ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop); 
相關問題