sauvegarder l'état du programme Qt MainWindow.restoreState

a marqué ce sujet comme résolu.

Salut Je suis entrain de faire un petit gestionnaire de d'item (au départ c'est une liste de film) je me retrouve à la fin où je dois sauvegarder l'état de ma liste pour que la prochaine fois que j'ouvre mon programme j'ai encore ma liste.

Voici ce que je fais :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void MainWindow::closeEvent(QCloseEvent *event){
    QByteArray save = this->saveState();
    QFile file{savePath};

    if(!file.open(QIODevice::ReadWrite | QIODevice::Truncate  )){
        qDebug() << "unable to openFile for saving in closeEvent ";
        return;
    }
    else{
        file.write(save);
        qDebug() <<"save completed no ?";
    }

}
void MainWindow::loadLastData(){
    QFile f{savePath};
    if(f.open(QIODevice::ReadOnly)){

        QByteArray theSave = f.readAll();
        restoreState(theSave);
        qDebug() << "data restored from previous session " << theSave;
    }
}

J'ai bien dans la console "save completed" et "data restored from previous session" donc le compilateur passe par la

Dans mon fichier j'ai quelque chose d'écrit mais les caractères ne s'affichent pas sur le site

Je n'utilise pas correctement saveStat() et restoreStat() ou bien ?

PS: j'écris dans un .txt, et j'ai essayé à plusieurs endroit (savePath)

et une autre question je dois faire this->method() ou method() car les deux fonctionnent, c'est quoi le plus juste ?

+0 -0

Quelle liste ? saveState/restoreState ne sauvegarde que les positions des éléments "dockable" de la mainwindow. Si tu veux enregistrer d'autres infos, il faut faire autrement.

Et utilises QSettings au lieu de QFile, ça simplifiera le code.

+0 -0

Oui je n'ai pas détaillé le reste, je ne pensais pas que l'erreur venait de la. J'ai un QListWidget, j'ajoute des QListWidgetItem à ma liste avec un QPushButton connecté à un slot addRow()

Je pensais que lorsque je sauvegardais ma fenêtre, ça sauvegardais ce qu'il y avait à l'intérieur et donc la liste et les items étaient sauvegardés. Je n'ai pas du comprendre correctement la doc.

voici ce que je veux retrouver après avoir fermé et ré-ouvert le programme https://imgur.com/eMCjQeI

J'ai été jeté un coup d'oeil à la doc de QSettings et on lui donne en paramètre un QVariant et http://doc.qt.io/qt-5/qvariant-obsolete.html#Type-enum il est dit ici que QListWidgetItem n'est pas supporté par QVariant. Il faut que je reprenne toutes les valeurs de mon item (texte + icon) et que les stock dans un QVariant et que je fasse Qsettings.setvalue(monItem1, texte); et QSettings.setValue(monItem1Bis,icon); ou il existe un moyen moins lourd ?

+0 -0

Il est normal que les Widget ne soient pas sérialisable (sémantique d’entité). Ton problème vient d'un problème de conception : tu n'as pas clairement séparer ton code métier du code GUI.

Une séparation correcte serait d'avoir d'un coté tes données (textes, images, etc) que tu vas manipuler (enregistrer, trier, éditer, etc) et leur affichage. Ta partie GUI travaillerais alors sur ces données.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// tes données
class XxxData {
    ... // manipuilation de tes donnees
    operator QVariant() const; // conversion en QVariant
private:
    QString m_text;
    QImage  m_image;
};
Q_DECLARE_METATYPE(XxxData)

using XxxList = QVector<XxxData>;

// pour enregistrer
XxxList dataList;
Qsettings.setvalue("mes data", dataList);
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte