Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT] Problème de traduction

    7 septembre 2014 à 22:47:35

    Bonjour, 

    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();
    
    
    }

    FenGenere.h

    #ifndef FENGENERE_H
    #define FENGENERE_H
    
    #include <QtWidgets>
    
    class FenGenere : public QDialog {
    
        public:
    
            FenGenere(QString &code, QWidget *parent);
    
        private:
    
            QTextEdit *m_codeEditor;
            QPushButton *m_closeButton;
    
    
    };
    
    #endif // FENGENERE_H
    

    FenGenere.cpp

    #include "FenGenere.h"
    
    FenGenere::FenGenere(QString &code, QWidget *parent = 0) : QDialog(parent){
    
        m_codeEditor = new QTextEdit;
        m_codeEditor->setPlainText(code);
        m_codeEditor->setReadOnly(true);
        m_codeEditor->setFont(QFont("Courier", 10));
        m_codeEditor->setLineWrapMode(QTextEdit::NoWrap);
    
        m_closeButton = new QPushButton(tr("Fermer"));
    
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(m_codeEditor);
        layout->addWidget(m_closeButton);
    
        resize(350,450);
        setLayout(layout);
        setWindowTitle("ZeroClassGenerator");
    
    
        connect(m_closeButton, SIGNAL(clicked()), this, SLOT(close()));
    
    }
    

    Voila, merci pour votre aide. 





    -
    Edité par _chris 7 septembre 2014 à 22:49:17

    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2021 à 16:14:31

      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

      • Partager sur Facebook
      • Partager sur Twitter

      [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.
      • Editeur
      • Markdown