2015-06-06 65 views
2

我想將QGraphicsScene中的所有項目保存到文件中。當我加載文件時,我應該能夠將它們用作QGraphicsItems(與以前一樣)。我將我的項目保存在一個QList中,比如我稱爲mItemsOnScreen的QGraphicsItem的QList。當我加載文件時,我應該能夠取回該列表。如何將這些項目保存到磁盤上的文件中。我應該使用什麼樣的文件格式?當然,我將如何閱讀該文件?請提供一些幫助...並提前致謝。保存/加載QGraphicsScene中的項目

我已經做到這一點,但它保存圖像格式:

void MainWindow::loadImage(){ QString fichier = QFileDialog::getOpenFileName(this, 
               tr("Open Image"), "C:/", tr("Image Files (*.png *.jpg *.bmp)")); 

    if(fichier != "") 
    { 
     //QGraphicsView *vue = new QGraphicsView(scene); 
     QPixmap monPixmap(fichier); 
     scene->addPixmap(monPixmap); 
     if(monPixmap.load(fichier)) 
      QMessageBox::information(0,"Chargement réussi","Le Diagrame a bien été chargé !"); 
     else 
      QMessageBox::critical(0,"Erreur de Chargement","Le Chargement du Diagrame a échoué !"); 
    } } 
+0

有沒有通用的方式來做到這一點。我會退後一步,對圖形場景中表示的數據進行操作,而不是序列化這些項目 –

回答

2

這裏是我會怎麼做。此代碼僅代表一般邏輯,您可能需要對其進行編輯才能使其工作。

QVariant item_to_variant(QGraphicsItem* item) { 
    QVariantHash data; 
    //save all needed attributes 
    data["pos"] = item->pos(); 
    data["rotation"] = item->rotation(); 
    if(QGraphicsPixmapItem* pixmap_item = dynamic_cast<QGraphicsPixmapItem*>(item)) { 
    data["type"] = "pixmap"; 
    data["pixmap"] = pixmap_item->pixmap(); 
    } else { /*...*/ } 
//... 
    return data; 
} 

QGraphicsItem* item_from_variant(QVariant v) { 
    QVariantHash data = v.toHash(); 
    QGraphicsItem* result; 
    if (data["type"].toString() == "pixmap") { 
    result = new QGraphicsPixmapItem(); 
    result->setPixmap(data["pixmap"].value<QPixmap>()); 
    } else { /*...*/ } 
    result->setPos(data["pos"].toPointf()); 
    result->setRotation(data["rotation"].toDouble()); 
    //... 
    return result; 
} 

void save_state() { 
    QVariantList data_list; 
    foreach(QGraphicsItem* item, items_list) { 
    data_list << item_to_variant(item); 
    } 
    QSettings settings; 
    settings.setValue("items", data_list); 
} 

void restore_state() { 
    QSettings settings; 
    foreach(QVariant data, settings.value("items").toList()) { 
    QGraphicsItem* item = item_from_variant(data); 
    scene->addItem(item); 
    items_list << item; 
    } 

}