2011-08-21 34 views
6

Đây là mã của tôi:Qt Graphics View, hiển thị hình ảnh! , Widget

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

    if(!fileName.isEmpty()) 
    { 
     QImage image(fileName); 

     if(image.isNull()) 
     { 
      QMessageBox::information(this,"Image Viewer","Error Displaying image"); 
      return; 
     } 

     QGraphicsScene scene; 
     QGraphicsView view(&scene); 
     QGraphicsPixmapItem item(QPixmap::fromImage(image)); 
     scene.addItem(&item); 
     view.show(); 
    } 

}

Tôi muốn hiển thị hình ảnh từ tập tin, mã hoạt động tốt nhưng disappiars hình ảnh rất nhanh.

Làm cách nào để tạm dừng màn hình hình ảnh?

Và làm cách nào tôi có thể tải hình ảnh trong tiện ích "graphicsView"?

Mã của tôi:

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

    if(!fileName.isEmpty()) 
    { 
     QImage image(fileName); 

     if(image.isNull()) 
     { 
      QMessageBox::information(this,"Image Viewer","Error Displaying image"); 
      return; 
     } 

     QGraphicsScene scene; 
     QGraphicsPixmapItem item(QPixmap::fromImage(image)); 
     scene.addItem(&item); 

     ui->graphicsView->setScene(&scene); 
     ui->graphicsView->show();  
    } 
} 

Nó không làm việc.

Cách sửa lỗi này?

Trả lời

16

Bạn cần phải tạo tất cả các đối tượng của bạn trên heap, nếu không họ sẽ bị xóa khi họ đi ra khỏi phạm vi:

QGraphicsScene* scene = new QGraphicsScene(); 
QGraphicsView* view = new QGraphicsView(scene); 
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image)); 
scene->addItem(item); 
view->show(); 

câu hỏi thứ hai của bạn có thể liên quan - scene được gán cho ui->graphicsView nhưng nó được xóa ngay lập tức sau đó, một lần nữa tạo tất cả các đối tượng của bạn trên heap.

+0

Và cách tránh rò rỉ bộ nhớ? : =) Tôi phải giải phóng bộ nhớ đúng ¿? :) –

+0

Có, bạn sẽ cần phải dọn dẹp bản thân với xóa. Tôi sẽ đề nghị bạn khai báo QGraphicsScene của bạn (và QGraphicsPixmapItem nếu nó không được sao chép trong additem) như là một biến con trỏ lớp. Và sau đó tôi khuyên bạn nên sử dụng một số loại con trỏ thông minh khi bạn khai báo biến, ví dụ: QSharedPointer: QSharedPointer ptr_scene; this-> ptr_scene = QSharedPointer (mới QGraphicsScene()) Sau đó, bộ nhớ được quản lý khi MainWindow bị đóng. – thomas

6

Nếu bạn không phải gắn bó với QGraphicsView, một khả năng là sử dụng QLabel để thay thế. Tôi không thể giải quyết nó cho QGraphicsView ...

QString filename = "X:/my_image"; 
QImage image(filename); 
ui->label->setPixmap(QPixmap::fromImage(image)); 
+0

Đây là hoạt động chậm nhất và quá mức. –

Các vấn đề liên quan