2013-07-27 5 views
1

는 내가 클릭하여 각 이미지에 뭔가를 그리려이액세스

void MainWindow::on_actionOpen_triggered() 
    { 
     QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::currentPath()); 
     if (!fileName.isEmpty()) { 
      QImage image(fileName); 
      if (image.isNull()) { 
       QMessageBox::information(this, tr("Master Measure"), 
           tr("Cannot load %1.").arg(fileName)); 
       return; 
      } 

      scene = new QGraphicsScene; 
      view = new QGraphicsView; 

      view->setScene(scene); 
      tabWidget->addTab(view,"someTab"); 

      scene->addPixmap(QPixmap::fromImage(image)); 
      scene->setBackgroundBrush(QBrush(Qt::lightGray, Qt::SolidPattern)); 

      QFileInfo fileInfo = fileName; 
      tabWidget->setTabText(ui->tabWidget->count()-1, fileInfo.baseName()); 
      tabWidget->setCurrentIndex(ui->tabWidget->count()-1); 
     } 
    } 

에 의해 QGraphicsScene과를 QGraphicsView에 새 탭에서 각각의 이미지를 열었다.

그래서 클릭을 눌러 이벤트에 의해

void MainWindow::mousePressEvent(QMouseEvent *event) 
{ 
    QPen pen(Qt::black); 
    QBrush brush(Qt::red); 
    pen.setWidth(6); 
    scene->addEllipse(0,0,1000,500,pen,brush); 
} 

그냥 마지막으로 연 이미지 (탭)에 타원을 그릴을이했다.

이 문제를 해결하는 방법을 모르겠습니다.

아무쪼록 고맙습니다. 감사합니다.

답변

0

분명히 scene 변수는 마지막으로 생성 된 장면을 가리 킵니다. 새 장면을 만들 때 이전 포인터는 아무 것도 저장하지 않기 때문에 손실됩니다. 따라서 모든 장면을 보존하고 포인터를 어딘가에서보고 현재 보이는 객체를 사용해야합니다.

각 탭의 내용을 담당 할 QGraphicsView 하위 클래스 (MyView)를 생성하는 것이 좋습니다. 이 객체의 생성자에 파일 이름을 전달합니다. 생성자에서 장면을 만들고 멤버 변수에 저장합니다. 도면을 수행하려면 MyView::mousePressEvent을 다시 구현하십시오.

그럼 당신은 이런 식으로 새 탭을 추가 할 수 있습니다

MyView* view = new MyView(filename); 
view ->addTab(view,"someTab"); 

사용자가보기 MyView::mousePressEvent 방법 또는 각각의 MyView 객체가 호출됩니다를 클릭하면. 각보기는 자신의 scene 변수 만 볼 수 있으며 해당 장면이 편집됩니다.

+0

감사합니다. 네가 한 말대로 할게. 결과를 나눌거야. – dare

+0

그것은 @Riateche를 작동합니다. 고맙습니다. – dare