J'utilise Qt 5.3 et j'ai suivi le tuto sur le C++, plus précisément cette partie.
J'ai appliqué ce chapitre au tp ZeroClassGenerator, le programme et bien traduit en anglais ... mais seulement la première fenêtre. En effet, le bouton "Fermer" de la deuxième fenêtre n'est pas traduit alors que j'ai bien fait et valider la traduction dans Qt Linguist. Je suis un peu perdu et je m'en remet donc à vous Voici mes sources :
main.cpp
#include <QApplication>
#include <FenPrincipale.h>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
int main(int argc, char *argv[]){
QApplication app(argc, argv);
// Implémentation de la traduction de l'application
QString locale = QLocale::system().name().section('_',0,0);
QTranslator translator;
translator.load("zeroclassgenerator_en" );
app.installTranslator(&translator);
FenPrincipale fenetre;
fenetre.show();
return app.exec();
}
FenPrincipale.h
#ifndef FENPRINCIPALE_H
#define FENPRINCIPALE_H
#include <QApplication>
#include <QtWidgets>
class FenPrincipale : public QWidget {
Q_OBJECT
public:
FenPrincipale();
public slots:
void generateCode();
void editHeader(QString header);
private:
// Définition de la classe
QLineEdit *m_classeName;
QLineEdit *m_superClasse;
QLineEdit *m_headerGuard;
// Options
QCheckBox *m_headerProtect;
QCheckBox *m_constructor;
QCheckBox *m_destructor;
// Ajouter des commentaires
QGroupBox *m_group3;
QLineEdit *m_autor;
QDateEdit *m_creationDate;
QTextEdit *m_classeRole;
// Autre
QPushButton *m_generate;
QPushButton *m_exit;
};
#endif // FENPRINCIPALE_H
FenPrincipale.cpp
#include "FenPrincipale.h"
#include "FenGenere.h"
FenPrincipale::FenPrincipale() : QWidget() {
// Définition de la classe
// Creation des objets et configuration
QGroupBox *groupe1 = new QGroupBox(tr("Définition de la classe"));
QFormLayout *form1 = new QFormLayout;
m_classeName = new QLineEdit;
m_superClasse = new QLineEdit;
m_headerGuard = new QLineEdit("HEADER_");
// Ajout des objets au layout
form1->addRow(tr("&Nom : "), m_classeName);
form1->addRow(tr("Classe &mère : "), m_superClasse);
form1->addRow(tr("En-tête : "), m_headerGuard);
// Définition du layout du groupe
groupe1->setLayout(form1);
// Options
// Création des objets et configuration
QGroupBox *groupe2 = new QGroupBox(tr("Options"));
QVBoxLayout *vbox1 = new QVBoxLayout;
m_headerProtect = new QCheckBox(tr("Protéger le &header contre les inclusions multiples"));
m_headerProtect->setChecked(true);
m_constructor = new QCheckBox(tr("Générer un &constructeur par défaut"));
m_destructor = new QCheckBox(tr("Générer un &destructeur"));
// Ajout des objets au layout
vbox1->addWidget(m_headerProtect);
vbox1->addWidget(m_constructor);
vbox1->addWidget(m_destructor);
// Définition du layout du groupe
groupe2->setLayout(vbox1);
// Ajouter des commentaires
// Creation des objets et configuration
m_group3 = new QGroupBox(tr("Ajouter des commentaires"));
m_group3->setCheckable(true);
m_group3->setChecked(false);
QFormLayout *form2 = new QFormLayout;
m_autor = new QLineEdit;
// Edition de la date
m_creationDate = new QDateEdit;
m_creationDate->setDisplayFormat(tr("dd.MM.yyyy", "Format de la date"));
m_creationDate->setDate(QDate::currentDate());
m_creationDate->setCalendarPopup(true);
m_classeRole = new QTextEdit;
// Ajout des objets au layout
form2->addRow(tr("&Auteur : "), m_autor);
form2->addRow(tr("Da&te de création : "), m_creationDate);
form2->addRow(tr("&Rôle de la classe : "), m_classeRole);
// Définition du layout du groupe
m_group3->setLayout(form2);
// Boutons
m_generate = new QPushButton(tr("Générer !"));
m_exit = new QPushButton(tr("Quitter"));
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addWidget(m_generate);
hbox->addWidget(m_exit);
hbox->setAlignment(Qt::AlignRight);
// Conteneur principal
QVBoxLayout *mainContent = new QVBoxLayout;
mainContent->addWidget(groupe1);
mainContent->addWidget(groupe2);
mainContent->addWidget(m_group3);
mainContent->addLayout(hbox);
// Définition des paramètre de la fenetre
setWindowTitle("Zero Class Generator");
setFont(QFont("Arial", 12));
setLayout(mainContent);
// Connexions
connect(m_exit, SIGNAL(clicked()), qApp, SLOT(quit()));
connect(m_generate, SIGNAL(clicked()), this, SLOT(generateCode()));
connect(m_headerProtect, SIGNAL(clicked(bool)), m_headerGuard, SLOT(setEnabled(bool)));
connect(m_classeName, SIGNAL(textEdited(QString)), this, SLOT(editHeader(QString)));
}
void FenPrincipale::editHeader(QString header){
m_headerGuard->setText("HEADER_" + header.toUpper());
}
void FenPrincipale::generateCode(){
// On vérifie si la classe à un nom
if(m_classeName->text().isEmpty()){
QMessageBox::critical(this, tr("Erreur !"), tr("Vous devez spécifier un nom pour la classe"));
return;
}
// Génération du code
QString code("");
// Génération des commentaires
if(m_group3->isChecked()){
QDate date = m_creationDate->date();
code += "/*\nAuteur : "
+m_autor->text() + "\nDate de création : "
+date.toString("ddd MMMM dd yyyy") + "\n\nRôle :\n"
+m_classeRole->toPlainText()+"\n*/\n";
}
// Génération de la sécurité header
if(m_headerProtect->isChecked()){
code += "\n#ifndef " + m_headerGuard->text().toUpper() + "\n"
+ "#define " + m_headerGuard->text().toUpper() + "\n";
}
// Génération de la classe
code += "\nclass "+m_classeName->text();
// Si la classe hérite d'une autre classe
if(!m_superClasse->text().isEmpty()){
code += " : public "+m_superClasse->text();
}
code += " {\n\n\tpublic:\n\n";
// Si le constructeur doit être généré
if(m_constructor->isChecked()){
code += "\t\t" + m_classeName->text() + "();\n";
}
// Si le destructeur doit être généré
if(m_destructor->isChecked()){
code += "\t\t~" + m_classeName->text() + "();\n";
}
code += "\n\n\tprotected:\n\n\tprivate:\n\n};\n";
if(m_headerProtect->isChecked()){
code += "\n#endif // "+ m_headerGuard->text().toUpper();
}
FenGenere editeur(code, this);
editeur.exec();
}
Je sais que ce sujet est ancien, mais j’ai eu exactement le même problème et je n’ai pas trouvé la réponse précise dans le forum ; venant d’enfin résoudre le problème (inspiré par ce message), je réponds ici histoire d’aider les âmes en peine dans mon genre.
Il suffit en fait d’ajouter la macro Q_OBJECT dans l’en-tête de la classe FenGenere (fichier FenGenere.h). J’ai ensuite eu besoin d’effectuer une exécution de qmake (dans Qt Creator, Compiler > Exécuter qmake), et ce satané bouton a finalement daigné afficher Close au lieu de Fermer.
Je ne connais pas les détails souterrains expliquant cela, mais de la même manière que Q_OBJECT sert pour les signaux, il est utile pour certaines choses à l’exécution, dont apparemment le processus de traduction.
The moc tool reads a C++ header file. If it finds one or more class declarations that contain the Q_OBJECT macro, it produces a C++ source file containing the meta-object code for those classes. Among other things, meta-object code is required for the signals and slots mechanism, the run-time type information, and the dynamic property system.
Source : https://doc.qt.io/qt-5/moc.html
[QT] Problème de traduction
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.