syntaxe à comprendre
-
bonjour,
Un prof de Qt pour débutants a codé ceci:
#include <QtGui> #include <QtWidgets> stopBout = new QPushButton(tr("&Arret"));
pourquoi il n'a pas écrit?:
#include <QtGui> #include <QtWidgets> stopBout = new QPushButton(tr("Arret"));
de même,il a codé:
#include <QtGui> #include <QtWidgets> QPushButton * stopBout = new QPushButton("&Arret");
pourquoi il n'a pas écrit?:
#include <QtGui> #include <QtWidgets> QPushButton * stopBout = new QPushButton("Arret");
merci de votre aide
-
@signalK said in syntaxe à comprendre:
Un prof de Qt pour débutants a codé ceci:
#include <QtGui> #include <QtWidgets> stopBout = new QPushButton(tr("&Arret"));
Juste par curiosité : Est-ce qu'il a compilé ? Parce que je ne vois pas la déclaration de
stopBout
.Vous pouvez laisser tomber
#include <QtGui>
, car<QtWidgets>
le contient déjà. Et, en fait, le prof aurait dû vous expliquer ce que sont les accélérateurs de clavier... -
voici le code complet:
// exemple plus evolue du debut d'un editeur de texte #include <QtGui> #include <QtWidgets> int main(int N, char *P[]) { // on cree une application graphique app QApplication app(N, P); // on ajoute un objet pour saisir du texte et on le rend visible QTextEdit *texte = new QTextEdit; // on ajoute un bouton poussoir (QPushButton) pour fermer la fenetre QPushButton * stopBout = new QPushButton("&Arret"); // on connecte le bouton avec la methode heritee de la classe QObject QObject::connect(stopBout, SIGNAL(clicked()), qApp, SLOT(quit())); // on definit un gestionnaire de zone d'affichage type boite verticale QVBoxLayout * gestZone = new QVBoxLayout; gestZone->addWidget(texte); gestZone->addWidget(stopBout); // on ajoute un QWidget fenetre pour y mettre le gestZone QWidget fenetre; fenetre.setLayout(gestZone); fenetre.show(); // on lance l'application et on recupere le code retour pour terminer le // programme return app.exec(); }
voici l'autre code complet:
// editeur.cpp : code de la classe Editeur #include "editeur.h" Editeur::Editeur() { texte = new QTextEdit; stopBout = new QPushButton(tr("&Arret")); connect(stopBout, SIGNAL(clicked()), this, SLOT(quit())); QVBoxLayout * gz = new QVBoxLayout; gz->addWidget(texte); gz->addWidget(stopBout); setLayout(gz); setWindowTitle(tr("Editeur")); } void Editeur::quit() { // On utilise une boite a question pour demander une validation de fin // on va prendre la classe QMessageBox QMessageBox messageBox; messageBox.setWindowTitle(tr("Editeur")); messageBox.setText(tr("Voulez-vous vraiment quitter ?")); messageBox.setStandardButtons( QMessageBox::Yes | QMessageBox::No ); messageBox.setDefaultButton(QMessageBox::No); if (messageBox.exec() == QMessageBox::Yes) qApp->quit(); }
non non le prof nous a pas parlé d'accélérateurs claviers.
Qu'est-ce que c'est?
Ah oui ! j'ai trouvé ceci:
https://www.digitalfanatics.org/projects/qt_tutorial/fr/chapter07.htmlmentionnant ceci:
Les caractères & indique à Qt de souligner le caractère suivant et de l'employer comme raccourci clavier.1)Donc le prof aurait pu se passer de souligner le caractère suivant pour l'utiliser un raccourci et coder sans écrire le &.
La fonction tr est définie comme ceci:
QString tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)
le 1er argument cons char*sourceText est une chaîne de caractères et peut bien se passer de &.
Est-ce bien cela?2)Si la fonction tr est utlisée comme ceci:
stopBout = new QPushButton(tr("&Arret"));
où le constructeur QPushButton de la classe QObject est défini comme ceci:
QPushButton(QWidget *parent = nullptr)
tr doit renvoyer un pointeur de type Qwidget
Où cela dans la doc est-il indiqué que tr renvoie un pointeur de type QWidget? -
@signalK
Le code utilise ce constructeurQPushButton
:explicit QPushButton(const QString &text, QWidget *parent = nullptr);
Par ailleurs, la syntaxe de connexion utilisée dans le code est obsolète depuis de nombreuses années déjà. Il utilise une conversion de string coûteuse au moment de l'exécution:
QObject::connect(stopBout, SIGNAL(clicked()), qApp, SLOT(quit()));
Bien que notre propre code l'utilise encore, nous le remplaçons dans la mesure du possible par une version bien meilleure qui utilise des fonctions de type "pointer-to-member-function":
QObject::connect(stopBout, &QPushButton::clicked, qApp, &QApplication::quit);
C'est beaucoup plus rapide, il n'y a pas besoin de traduction en cours d'exécution et vous pouvez vérifier la syntaxe dans l'éditeur. Salutations au prof...
-
je ne comprends toujours pas.Quand est écrit dans la doc ceci:
QString tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)
tr renvoie quoi ou quel type?
-
merci
j'ai compris mon erreur(mauvais constructeur choisi pour la classe QPushButton)
le bon constructeur est:QPushButton(const QString &text, QWidget *parent = nullptr)
qui attend en paramètre un texte de type QString donc tr est valable en tant que paramètre car renvoie un QString