sauvegarder l'état du programme Qt MainWindow.restoreState

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 ?

Édité par d3m0t3p

conseil: le thé est meilleur avec un zeste de citron

+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
Auteur du sujet

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 ?

conseil: le thé est meilleur avec un zeste de citron

+0 -0

Cette réponse a aidé l'auteur du sujet

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
Auteur du sujet

okok, merci à toi. Quelles sont les règles à respecter pour arriver à faire de bon designs (en plus de séparer GUI/ressource), ou aurais-tu un livre à me recommandé parlant du sujet ?

conseil: le thé est meilleur avec un zeste de citron

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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