2013-07-05 1 views
0

사용자가 파일을 선택하여 QGraphicsView에 추가 할 수있는 프로그램을 개발 중입니다. 모든 항목은 항목 위치 지정을 제외하고는 잘 작동합니다. 모든 이미지는 동일한 위치에 표시됩니다. 당신이 어떤에 대한 설정 및 항목의 위치를 ​​검색 할 때 영향을 미치는 것 좌표계를 생각하는 데 필요한 QGraphicsSystem를 사용하는 경우 소스 코드는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

다음과 같다.

부모가없는 항목의 경우 및 부모가 없으면 항목의 장면 좌표를 설정한다고 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);