Coucou,
Je suis en train de coder un programme assez conséquent (pour le moment 11 classes).
Et j'ai besoin de le traduire en plusieurs langues.
J'utilise une QComboBox pour que l'utilisateur puisse choisir sa langue. Puis un QPushButton Reset pour que l'utilisateur puisse remettre ses paramètres par défaut (dont la langue).
Les paramètres sont enregistrés dans un fichier .ini, utilisé grâce à un QSettings.
Pour changer la langue en cours j'appelle une méthode.
Le changement de la langue fonctionne très bien à partir de la QComboBox, mais mon programme plante dès que j'appuie sur le bouton reset.
Je ne vais pas poster le code complet de ma classe (car elle fait plus de 500 lignes), mais en voici quelques morceaux :
le constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 Reglage::Reglage() { //création de la page principale qui contiendra les boutons pour naviguer avec les autres pages pageReglage = new QWidget(this); //création et paramétrage du bouton associé à region boutonRegion = new QPushButton(pageReglage); boutonRegion->setIcon(QIcon("image/region.gif"));//met une image dans le bouton boutonRegion->setGeometry(200,100,60,60);//fixe la taille du bouton //connexion du bouton Région au slot qui crée la page région QObject::connect(boutonRegion,SIGNAL(clicked()),this,SLOT(changerPageRegion())); //création et paramétrage du bouton associé à divers boutonDivers = new QPushButton(pageReglage); boutonDivers->setIcon(QIcon("image/divers.gif"));//met une image dans le bouton boutonDivers->setIconSize(QSize(50,50));//fixe la taille de l'image dans le bouton boutonDivers->setGeometry(350,100,60,60);//fixe la taille du bouton //connexion du bouton Divers au slot qui crée la page Divers QObject::connect(boutonDivers,SIGNAL(clicked()),this,SLOT(changerPageDivers())); //création et paramétrage du bouton retour boutonRetour = new QPushButton(this); boutonRetour->setGeometry(10,200,60,60);//fixe la taille du bouton boutonRetour->setIcon(QIcon("image/retour.gif"));//met une image dans le bouton boutonRetour->setIconSize(QSize(50,50));//fixe la taille de l'image dans le bouton boutonRetour->hide();//on cache le bouton dans la page principale (il ne sera afficher que lorsque la page blocnote ou minuteur sera ouverte) translator = new QTranslator(this); }
Le slot qui créée la page contenant la QComboBox (et le connecte) :
Le slot qui crée la page contenant le bouton reset :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 void Reglage::changerPageRegion(void) { pageReglage->hide();//on cache la page principale boutonRetour->show();//on affiche le bouton retour QObject::connect(boutonRetour,SIGNAL(clicked()),this,SLOT(changerPageReglage_Region())); pageRegion = new QWidget (this); pageRegion->move(80,0); QSettings setting ("parametre.ini", QSettings::IniFormat); /*combo Langue*****************************************************************/ labelComboLangue = new QLabel(tr("Langue :"),pageRegion); labelComboLangue->setFont(QFont(0, 9, QFont::Bold));//fixe la police du label labelComboLangue->move(10,20); comboLangue = new QComboBox(pageRegion); comboLangue->move(190,20); comboLangue->addItem(tr("Français")); comboLangue->addItem(tr("Anglais")); QString temp = setting.value("langueAppli").toString(); if(temp.operator ==("en")) comboLangue->setCurrentIndex(1); QObject::connect(comboLangue,SIGNAL(activated(int)),this,SLOT(actualiseFichierParamLangue(int))); }
Les slots changerPageReglage_Divers et changerPageReglage_Region appelles les destructeurs des page Divers ou Region.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 void Reglage::changerPageDivers(void) { pageReglage->hide();//on cahce la page principale boutonRetour->show();//on affiche le bouton retour QObject::connect(boutonRetour,SIGNAL(clicked()),this,SLOT(changerPageReglage_Divers())); pageDivers = new QWidget (this); pageDivers->setFixedWidth(500);//test pour tout afficher labelBoutonResetParametres = new QLabel(tr("Mettre la configuration des paramètres par défaut :"),pageDivers); labelBoutonResetParametres->move(20,20); labelBoutonResetParametres->setFont(QFont(0, 9, QFont::Bold));//fixe la police du label boutonResetParametres = new QPushButton (tr("Reset !"),pageDivers); boutonResetParametres->setGeometry(60,40,60,60); QObject::connect(boutonResetParametres,SIGNAL(clicked()),this,SLOT(actualiseParDefaut())); pageDivers->show(); }
Le slot connecté à la QComboBox :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void Reglage::actualiseFichierParamLangue(int vide) { if(comboLangue->currentIndex() ==0) { QSettings setting ("parametre.ini", QSettings::IniFormat); setting.setValue("langueAppli","fr"); this->actualiserLangue(); } else { QSettings setting ("parametre.ini", QSettings::IniFormat); setting.setValue("langueAppli","en"); this->actualiserLangue(); } }
Le slot connecté au bouton Reset :
C'est donc ici que les problèmes apparaissent, le programme se quitte quand j'appuie sur le bouton reset. Mais tout les qDebug s'affichent en console.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 void Reglage::actualiseParDefaut(void) { QSettings setting ("parametre.ini", QSettings::IniFormat); QSettings defaut ("parametreDefaut.ini", QSettings::IniFormat); setting.setValue("luminosite",defaut.value("luminosite")); setting.setValue("screensvr",defaut.value("screensvr")); setting.setValue("lumCavite",defaut.value("lumCavite")); setting.setValue("bipTouche",defaut.value("bipTouche")); setting.setValue("langueAppli",defaut.value("langueAppli")); setting.setValue("formatDate",defaut.value("formatDate")); setting.setValue("formatHeure",defaut.value("formatHeure")); setting.setValue("uniteTemp",defaut.value("uniteTemp")); qDebug("avant appel méthode"); this->actualiserLangue(); qDebug("apres appel methode"); QString cmd; cmd=QString("echo "+(QString::number(((setting.value("luminosite").toInt() )*2.45)+10))+" > /sys/class/backlight/imx-bl/brightness"); // std::system(cmd.toLatin1().data()); qDebug("apres envoie commande"); }
La méthode qui traduit (la même qui est appelée pour la QComboBox et pour la QPushButton) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void Reglage::actualiserLangue(void) { qDebug("methode actualiser langue"); QSettings setting ("parametre.ini", QSettings::IniFormat); qApp->removeTranslator(translator); qDebug("methode : apres remove"); translator->load(QString("zeroclassgenerator_") + setting.value("langueAppli").toString()); qDebug("methode apres load"); qApp->installTranslator(translator); qDebug("méthode apres install"); }
J'ai beau cherché, je n'arrive pas à comprendre pourquoi la méthode fonctionne quand elle est appelée à un endroit (slot actualiseFichierParamLangue) et pas quand elle est appelée à un autre (slot actualiseParDefaut), si j'enlève la ligne qApp->installTranslator(translator); le programme ne plante plus (mais bien évidemment cela ne traduit rien du tout).
J'espère que vous pourez m'aider, si vous avez besoin de plus de détail sur mon code n'hésitez pas, j'ai tellement la tête dedans que j'ai surement oublié de préciser certaines choses.
Partager