2011-08-21 10 views
6

यहां मेरा कोड है:क्यूटी ग्राफिक्स देखें, छवि दिखाओ! विजेट

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(); 
    } 

}

मैं फ़ाइल से छवि प्रदर्शित करना चाहता हूं, कोड ठीक काम करता है लेकिन छवि बहुत तेज़ी से निराश होती है।

मैं छवि स्क्रीन को कैसे रोक सकता हूं?

और मैं "ग्राफिक्स व्यू" विजेट में छवि कैसे लोड कर सकता हूं?

मेरा कोड:

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();  
    } 
} 

यह काम नहीं करता है।

इसे कैसे ठीक करें?

उत्तर

16

आप ढेर पर अपने सभी वस्तुओं को बनाने की जरूरत है, अन्यथा वे हटा दिया जाता है जब वे क्षेत्र से बाहर जाना:

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

आपका दूसरा प्रश्न संबंधित हो सकती है - sceneui->graphicsView को सौंपा गया है, लेकिन यह तुरंत हटा हो जाता है उसके बाद, फिर अपनी सारी वस्तुओं को ढेर पर बनाएं।

+0

और मेमोरी लीक से कैसे बचें? : =) मुझे मेमोरी सही ¿जारी करना है? :) –

+0

हां आपको खुद को हटाने के साथ साफ करने की आवश्यकता होगी। मैं सुझाव दूंगा कि आप क्लास पॉइंटर वैरिएबल के रूप में अपने क्यूग्राफिक्ससेन (और क्यूग्राफिक्स पिक्समैप इटिम अगर इसे एडिटेम के दौरान कॉपी नहीं करते हैं) घोषित करें। और फिर मैं सुझाव दूंगा कि जब आप वैरिएबल घोषित करते हैं तो आप कुछ प्रकार के स्मार्ट पॉइंटर का उपयोग करते हैं। QSharedPointer: <कक्षा शीर्षलेख में> QSharedPointer ptr_scene; <स्रोत फ़ाइल में> यह-> ptr_scene = QSharedPointer (नया QGraphicsScene()) तब मेनविंडो बंद होने पर स्मृति प्रबंधित होती है। – thomas

6

यदि आपको QGraphicsView के साथ चिपकने की आवश्यकता नहीं है तो एक संभावना है कि इसके बजाय QLabel का उपयोग करें। मैंने QGraphicsView के लिए इसे हल करने का प्रबंधन नहीं किया ...

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

यह सबसे धीमा और ओवरकिल ऑपरेशन है। –