Se connecter avec
S'enregistrer | Connectez-vous

{Résolu} [QT] Afficher valeur sélectionnée dans un QLabel

Dernière réponse : dans Programmation

Bonjour (encore :)  )

Sur QT 4.3.2, j'ai un petit problème (pas bien méchant sans doute) très énervant.

Je m'explique.

Mon programme est composé d'une fenetre principale elle même composée de 4 onglets.

Lorsque je sélectionne une valeur du TreeView de l'onglet de la page2 par exemple, je voudrais que (après clic sur le bouton sélectionner) cette valeur s'affiche dans le labelorigine de la page4. Mais je ne parviens pas a récupérer cette valeur.

C'est pour un synchroniseur :) 

voici mon code.
  1. #include "MaFenetre.h"
  2.  
  3. MaFenetre::MaFenetre() : QWidget()
  4. {
  5. setWindowTitle("S1kronize");
  6. setWindowIcon(QIcon("MAGMA.png"));
  7.  
  8. //1 on crée le QTabWidget
  9. QTabWidget *onglets = new QTabWidget(this);
  10. onglets->setGeometry(0, 0, 400, 200);
  11.  
  12. //2 on crée les pages en utilisant un widget parent pour contenir chacune des pages
  13. QWidget *page1 = new QWidget;
  14. QWidget *page2 = new QWidget;
  15. QWidget *page3 = new QWidget;
  16. QWidget *page4 = new QWidget;
  17.  
  18. //3 on crée le contenu des pages de widgets
  19. //page1
  20.  
  21. m_apropos = new QPushButton("A propos", this);
  22. m_quitter = new QPushButton("Quitter", this);
  23. QVBoxLayout *vbox1 = new QVBoxLayout;
  24. vbox1->addWidget(m_apropos);
  25. vbox1->addWidget(m_quitter);
  26.  
  27. QObject::connect(m_quitter, SIGNAL(clicked()), this, SLOT(ouvrir()));
  28. QObject::connect(m_apropos, SIGNAL(clicked()), this, SLOT(propos()));
  29.  
  30. page1->setLayout(vbox1);
  31.  
  32. //page2
  33. boutonSelect1 = new QPushButton("Sélectionner");
  34. QVBoxLayout *vbox2 = new QVBoxLayout;
  35. modele1 = new QDirModel;
  36. vue1 = new QTreeView;
  37. vue1->setModel(modele1);
  38. vbox2->addWidget(vue1);
  39. vbox2->addWidget(boutonSelect1);
  40.  
  41. QObject::connect(boutonSelect1, SIGNAL(clicked()), this, SLOT(afficher1()));
  42.  
  43. page2->setLayout(vbox2);
  44.  
  45. //page3
  46. boutonSelect2 = new QPushButton("Sélectionner");
  47. QVBoxLayout *vbox3 = new QVBoxLayout;
  48. modele2 = new QDirModel;
  49. vue2 = new QTreeView;
  50. vue2->setModel(modele2);
  51. vbox3->addWidget(vue2);
  52. vbox3->addWidget(boutonSelect2);
  53.  
  54. QObject::connect(boutonSelect2, SIGNAL(clicked()), this, SLOT(afficher2()));
  55.  
  56. page3->setLayout(vbox3);
  57.  
  58. //page4
  59. m_synchroniser = new QPushButton("SYNCHRONISER", this);
  60. QVBoxLayout *vbox4 = new QVBoxLayout;
  61. QLabel *origine = new QLabel(this);
  62. QLabel *destination = new QLabel(this);
  63.  
  64. origine->setText("Elément d'origine sélectionné: " + elementSelectionne1 + "");
  65. destination->setText("Elément de destination sélectionné: " + elementSelectionne2 + "");
  66.  
  67.  
  68. vbox4->addWidget(origine);
  69. vbox4->addWidget(destination);
  70.  
  71. vbox4->addWidget(m_synchroniser);
  72.  
  73. page4->setLayout(vbox4);
  74.  
  75. //4 on ajoute les onglets au QTabWidget en indiquant la page qu'ils contiennent
  76. onglets->addTab(page1, "Accueil");
  77. onglets->addTab(page2, "Dossier d'origine");
  78. onglets->addTab(page3, "Dossier de destination");
  79. onglets->addTab(page4, "SYNCHRONISER");
  80.  
  81. }
  82.  
  83.  
  84. void MaFenetre::ouvrir()
  85. {
  86. int reponse = QMessageBox::warning(this, "Quitter", "Voulez-vous vraiment quitter?", QMessageBox::Yes | QMessageBox::No);
  87. if (reponse == QMessageBox::Yes)
  88. {
  89. QObject::connect(m_oui, SIGNAL(clicked()), qApp, SLOT(quit()));
  90. }
  91. else if (reponse == QMessageBox::No)
  92. {
  93. }
  94.  
  95. }
  96.  
  97. void MaFenetre::propos()
  98. {
  99. QMessageBox::information(this, "A propos", "S1kronize a été développé par <strong>Tib</strong> <br /> à l'aide du <a href=\"<a href="http://www.siteduzero.com" target="_blank">http://www.siteduzero.com</a>\">Site du Zéro</a> \<br />Ce programme peut être librement partagé.");
  100. }
  101.  
  102. void MaFenetre::afficher1()
  103. {
  104. QItemSelectionModel *selection1 = vue1->selectionModel();
  105. QModelIndex indexElementSelectionne1 = selection1->currentIndex();
  106. QVariant elementSelectionne1 = modele1->data(indexElementSelectionne1, Qt::DisplayRole);
  107. QMessageBox::information(this, "Elément sélectionné", elementSelectionne1.toString());
  108.  
  109. }
  110.  
  111. void MaFenetre::afficher2()
  112. {
  113. QItemSelectionModel *selection2 = vue2->selectionModel();
  114. QModelIndex indexElementSelectionne2 = selection2->currentIndex();
  115. QVariant elementSelectionne2 = modele2->data(indexElementSelectionne2, Qt::DisplayRole);
  116. QMessageBox::information(this, "Elément sélectionné", elementSelectionne2.toString());
  117.  
  118. }


L'erreur me dit que elementSelectionne1 et elementSelectionne2 ne sont pas déclarés.
J'ai bien essayé de modifié ca mais je n'ai fait qu'empirer les choses...

Merci d'avance
Lassé par la pub ? Créez un compte
Expert Programmation

Déjà, déclarer une autre variable locale elementSelectionne1 dans afficher1 avec le même nom que la variable membre, ce n'est pas propre, mais ce n'est pas le problème.
Si ce sont bien des variables membres de MaFenetre, tu n'a aucune raison d'avoir ce message. Quel est le message d'erreur exact ?

Salut, l'erreur exacte est:

MaFenetre.cpp:73: error: 'elementSelectionne1' undeclared (first use this function)
MaFenetre.cpp:73: error: (each undeclared identifier is reported only once for each function it appears in.)
MaFenetre.cpp:74: error: 'elementSelectionne2' undeclared (first use this function)


2 lignes d'erreur pour elementSelectionne1 et une seul pour elementSelectionne2 ?!?!

Voici le code de MaFenetre.h

  1. #ifndef DEF_MAFENETRE
  2. #define DEF_MAFENETRE
  3.  
  4. #include <QApplication>
  5. #include <QWidget>
  6. #include <QPushButton>
  7. #include <QMessageBox>
  8. #include <QFileDialog>
  9. #include <QIcon>
  10. #include <QLabel>
  11. #include <QDirModel>
  12. #include <QListView>
  13. #include <QVBoxLayout>
  14. #include <QInputDialog>
  15. #include <QtGui>
  16. #include <QDialog>
  17. #include <QTabWidget>
  18.  
  19. class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
  20. {
  21. Q_OBJECT
  22.  
  23. public:
  24. MaFenetre();
  25.  
  26. public slots:
  27.  
  28. void afficher1();
  29. void afficher2();
  30. void ouvrir();
  31. void propos();
  32.  
  33.  
  34. private:
  35. QPushButton *m_synchroniser;
  36. QPushButton *m_apropos;
  37. QPushButton *m_quitter;
  38. QPushButton *m_oui;
  39. QDirModel *modele1;
  40. QTreeView *vue1;
  41. QDirModel *modele2;
  42. QTreeView *vue2;
  43. QPushButton *boutonSelect1;
  44. QPushButton *boutonSelect2;
  45. QModelIndex *indexElementSelectionne1;
  46. QModelIndex *indexElementSelectionne2;
  47. QTabWidget *onglets;
  48.  
  49.  
  50. };
  51.  
  52. #endif


Je ne vois vraiment pas la...

En fait j'ai confondu elementSelectionne1 et elementSelectionne2 avec respectivement indexElementSelectionne1 et indexElementSelectionne2... j'ai donc déclaré elementSelectionne1 et elementSelectionne2 en tant que QVariant dans MaFenetre.h et là, nouvelle erreur:

MaFenetre.cpp:73: error: invalid operands of types 'const char[20]' and 'QVariant*' to binary 'operator+'
MaFenetre.cpp:74: error: invalid operands of types 'const char[25]' and 'QVariant*' to binary 'operator+'

J'ai bien essayé elementSelectionne1->toString() et elementSelectionne1.toString(), mais ca ne fonctionne pas...et je sens qu'il s'agit d'une petite erreur bénigne mais ceux sont souvent celles la les plus dures a trouver...

Je te poste dans l'ordre: le main.cpp, MaFenetre.h, MaFenetre.cpp:

  1. #include <QApplication>
  2. #include <QTranslator>
  3. #include <QLocale>
  4. #include <QLibraryInfo>
  5. #include "MaFenetre.h"
  6.  
  7. using namespace std;
  8.  
  9. void ouvrirdialogue();
  10. void ouvrir();
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14. QApplication app(argc, argv);
  15.  
  16. MaFenetre fenetre;
  17.  
  18.  
  19. QString locale = QLocale::system().name();
  20. QTranslator translator;
  21. translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
  22. app.installTranslator(&translator);
  23.  
  24. fenetre.show();
  25.  
  26. return app.exec();
  27. }



  1. #ifndef DEF_MAFENETRE
  2. #define DEF_MAFENETRE
  3.  
  4. #include <QApplication>
  5. #include <QWidget>
  6. #include <QPushButton>
  7. #include <QMessageBox>
  8. #include <QFileDialog>
  9. #include <QIcon>
  10. #include <QLabel>
  11. #include <QDirModel>
  12. #include <QListView>
  13. #include <QVBoxLayout>
  14. #include <QInputDialog>
  15. #include <QtGui>
  16. #include <QDialog>
  17. #include <QTabWidget>
  18.  
  19.  
  20. class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT)
  21. {
  22. Q_OBJECT
  23.  
  24. public:
  25. MaFenetre();
  26.  
  27. public slots:
  28.  
  29. void afficher1();
  30. void afficher2();
  31. void ouvrir();
  32. void propos();
  33.  
  34.  
  35. private:
  36. QPushButton *m_synchroniser;
  37. QPushButton *m_apropos;
  38. QPushButton *m_quitter;
  39. QPushButton *m_oui;
  40. QDirModel *modele1;
  41. QTreeView *vue1;
  42. QDirModel *modele2;
  43. QTreeView *vue2;
  44. QPushButton *boutonSelect1;
  45. QPushButton *boutonSelect2;
  46. QModelIndex *indexElementSelectionne1;
  47. QModelIndex *indexElementSelectionne2;
  48. QVariant *elementSelectionne1;
  49. QVariant *elementSelectionne2;
  50. QTabWidget *onglets;
  51.  
  52.  
  53. };
  54.  
  55. #endif


  1. #include "MaFenetre.h"
  2.  
  3. using namespace std;
  4.  
  5. MaFenetre::MaFenetre() : QWidget()
  6. {
  7. setWindowTitle("S1kronize");
  8. setWindowIcon(QIcon("MAGMA.png"));
  9.  
  10. //1 on crée le QTabWidget
  11. QTabWidget *onglets = new QTabWidget(this);
  12. onglets->setGeometry(0, 0, 500, 300);
  13.  
  14. //2 on crée les pages en utilisant un widget parent pour contenir chacune des pages
  15. QWidget *page1 = new QWidget;
  16. QWidget *page2 = new QWidget;
  17. QWidget *page3 = new QWidget;
  18. QWidget *page4 = new QWidget;
  19.  
  20. //3 on crée le contenu des pages de widgets
  21. //page1
  22.  
  23. m_apropos = new QPushButton("A propos", this);
  24. m_quitter = new QPushButton("Quitter", this);
  25. QVBoxLayout *vbox1 = new QVBoxLayout;
  26. QLabel *image = new QLabel(this);
  27. image->setPixmap(QPixmap("synchro.png"));
  28. vbox1->addWidget(image);
  29. vbox1->addWidget(m_apropos);
  30. vbox1->addWidget(m_quitter);
  31.  
  32. QObject::connect(m_quitter, SIGNAL(clicked()), this, SLOT(ouvrir()));
  33. QObject::connect(m_apropos, SIGNAL(clicked()), this, SLOT(propos()));
  34.  
  35. page1->setLayout(vbox1);
  36.  
  37. //page2
  38. boutonSelect1 = new QPushButton("Sélectionner");
  39. QVBoxLayout *vbox2 = new QVBoxLayout;
  40. modele1 = new QDirModel;
  41. QLabel *fenorigine = new QLabel(this);
  42. fenorigine->setText("Sélectionner le répertoire d'origine...");
  43. vue1 = new QTreeView;
  44. vue1->setModel(modele1);
  45. vbox2->addWidget(fenorigine);
  46. vbox2->addWidget(vue1);
  47. vbox2->addWidget(boutonSelect1);
  48.  
  49. QObject::connect(boutonSelect1, SIGNAL(clicked()), this, SLOT(afficher1()));
  50.  
  51. page2->setLayout(vbox2);
  52.  
  53. //page3
  54. boutonSelect2 = new QPushButton("Sélectionner");
  55. QVBoxLayout *vbox3 = new QVBoxLayout;
  56. modele2 = new QDirModel;
  57. QLabel *fendest = new QLabel(this);
  58. fendest->setText("Sélectionner le répertoire de destination...");
  59. vue2 = new QTreeView;
  60. vue2->setModel(modele2);
  61. vbox3->addWidget(fendest);
  62. vbox3->addWidget(vue2);
  63. vbox3->addWidget(boutonSelect2);
  64.  
  65. QObject::connect(boutonSelect2, SIGNAL(clicked()), this, SLOT(afficher2()));
  66.  
  67. page3->setLayout(vbox3);
  68.  
  69. //page4
  70. m_synchroniser = new QPushButton("SYNCHRONISER", this);
  71. QVBoxLayout *vbox4 = new QVBoxLayout;
  72. QLabel *origine = new QLabel(this);
  73. QLabel *destination = new QLabel(this);
  74.  
  75. origine->setText("Elément d'origine: " + elementSelectionne1->toString());
  76. destination->setText("Elément de destination: " + elementSelectionne2->toString());
  77.  
  78.  
  79. vbox4->addWidget(origine);
  80. vbox4->addWidget(destination);
  81.  
  82. vbox4->addWidget(m_synchroniser);
  83.  
  84. page4->setLayout(vbox4);
  85.  
  86. //4 on ajoute les onglets au QTabWidget en indiquant la page qu'ils contiennent
  87. onglets->addTab(page1, "Accueil");
  88. onglets->addTab(page2, "Dossier d'origine");
  89. onglets->addTab(page3, "Dossier de destination");
  90. onglets->addTab(page4, "SYNCHRONISER");
  91.  
  92. }
  93.  
  94.  
  95. void MaFenetre::ouvrir()
  96. {
  97. int reponse = QMessageBox::warning(this, "Quitter", "Voulez-vous vraiment quitter?", QMessageBox::Yes | QMessageBox::No);
  98. if (reponse == QMessageBox::Yes)
  99. {
  100. QObject::connect(m_oui, SIGNAL(clicked()), qApp, SLOT(quit()));
  101. }
  102. else if (reponse == QMessageBox::No)
  103. {
  104. }
  105.  
  106. }
  107.  
  108. void MaFenetre::propos()
  109. {
  110. QMessageBox::information(this, "A propos", "S1kronize a été développé par <strong>Tib</strong> à l'aide du <a href=\"<a href="http://www.siteduzero.com" target="_blank">http://www.siteduzero.com</a>\">Site du Zéro</a>.<br /> Ce programme s'utilise en parcourant les onglets de gauche à droite. <br />Peut être librement partagé.");
  111. }
  112.  
  113. void MaFenetre::afficher1()
  114. {
  115. QItemSelectionModel *selection1 = vue1->selectionModel();
  116. QModelIndex indexElementSelectionne1 = selection1->currentIndex();
  117. QVariant elementSelectionne1 = modele1->data(indexElementSelectionne1, Qt::DisplayRole);
  118. QMessageBox::information(this, "Elément sélectionné", elementSelectionne1.toString());
  119.  
  120. }
  121.  
  122. void MaFenetre::afficher2()
  123. {
  124. QItemSelectionModel *selection2 = vue2->selectionModel();
  125. QModelIndex indexElementSelectionne2 = selection2->currentIndex();
  126. QVariant elementSelectionne2 = modele2->data(indexElementSelectionne2, Qt::DisplayRole);
  127. QMessageBox::information(this, "Elément sélectionné", elementSelectionne2.toString());
  128.  
  129. }



La, le logiciel compile bien, mais...mon fichier.exe ne veut pas se lancer :( :( :( 

A quoi cela peut-il être dû?

Merci

En fait c'est lorsque je met elementSelectionne1->toString() et elementSelectionne2->toString() que le .exe ne veut plus se lancer...

Avec elementSelectionne1.toString(), l'erreur "toString has not been declared" apparait..

comprend p'u rien moi

Résolu...Voici comment j'ai procédé:

- au lieu de déclarer les labels dans MaFenetre.cpp je les ai déclaré dans MaFenetre.h (hé oui...)

- au lieu que APRES appel de la fonction afficher1 on affiche la valeur du label dans la page 4, j'ai fait en sorte que la fonction afficher1 renvoie aussi la valeur de l'élement selectionné dans le label origine.

Bref, voici le code:

  1. #include <string>
  2. #include "MaFenetre.h"
  3.  
  4. using namespace std;
  5.  
  6. MaFenetre::MaFenetre() : QWidget()
  7. {
  8. setWindowTitle("S1kronize");
  9. setWindowIcon(QIcon("MAGMA.png"));
  10.  
  11. //1 on crée le QTabWidget
  12. QTabWidget *onglets = new QTabWidget(this);
  13. onglets->setGeometry(0, 0, 500, 300);
  14.  
  15. //2 on crée les pages en utilisant un widget parent pour contenir chacune des pages
  16. QWidget *page1 = new QWidget;
  17. QWidget *page2 = new QWidget;
  18. QWidget *page3 = new QWidget;
  19. QWidget *page4 = new QWidget;
  20.  
  21. //3 on crée le contenu des pages de widgets
  22. //page1
  23.  
  24. m_apropos = new QPushButton("A propos", this);
  25. m_quitter = new QPushButton("Quitter", this);
  26. QVBoxLayout *vbox1 = new QVBoxLayout;
  27. QLabel *image = new QLabel(this);
  28. image->setPixmap(QPixmap("synchro.png"));
  29. vbox1->addWidget(image);
  30. vbox1->addWidget(m_apropos);
  31. vbox1->addWidget(m_quitter);
  32.  
  33. QObject::connect(m_quitter, SIGNAL(clicked()), this, SLOT(ouvrir()));
  34. QObject::connect(m_apropos, SIGNAL(clicked()), this, SLOT(propos()));
  35.  
  36. page1->setLayout(vbox1);
  37.  
  38. //page2
  39. boutonSelect1 = new QPushButton("Sélectionner");
  40. QVBoxLayout *vbox2 = new QVBoxLayout;
  41. modele1 = new QDirModel;
  42. QLabel *fenorigine = new QLabel(this);
  43. fenorigine->setText("Sélectionner le répertoire d'origine...");
  44. vue1 = new QTreeView;
  45. vue1->setModel(modele1);
  46. vbox2->addWidget(fenorigine);
  47. vbox2->addWidget(vue1);
  48. vbox2->addWidget(boutonSelect1);
  49.  
  50. QObject::connect(boutonSelect1, SIGNAL(clicked()), this, SLOT(afficher1()));
  51.  
  52. page2->setLayout(vbox2);
  53.  
  54. //page3
  55. boutonSelect2 = new QPushButton("Sélectionner");
  56. QVBoxLayout *vbox3 = new QVBoxLayout;
  57. modele2 = new QDirModel;
  58. QLabel *fendest = new QLabel(this);
  59. fendest->setText("Sélectionner le répertoire de destination...");
  60. vue2 = new QTreeView;
  61. vue2->setModel(modele2);
  62. vbox3->addWidget(fendest);
  63. vbox3->addWidget(vue2);
  64. vbox3->addWidget(boutonSelect2);
  65.  
  66. QObject::connect(boutonSelect2, SIGNAL(clicked()), this, SLOT(afficher2()));
  67.  
  68. page3->setLayout(vbox3);
  69.  
  70. //page4
  71. m_synchroniser = new QPushButton("SYNCHRONISER", this);
  72. QVBoxLayout *vbox4 = new QVBoxLayout;
  73. origine = new QLabel(this);
  74. destination = new QLabel(this);
  75.  
  76.  
  77.  
  78.  
  79. vbox4->addWidget(origine);
  80. vbox4->addWidget(destination);
  81.  
  82. vbox4->addWidget(m_synchroniser);
  83.  
  84. page4->setLayout(vbox4);
  85.  
  86. //4 on ajoute les onglets au QTabWidget en indiquant la page qu'ils contiennent
  87. onglets->addTab(page1, "Accueil");
  88. onglets->addTab(page2, "Dossier d'origine");
  89. onglets->addTab(page3, "Dossier de destination");
  90. onglets->addTab(page4, "SYNCHRONISER");
  91.  
  92. }
  93.  
  94.  
  95. void MaFenetre::ouvrir()
  96. {
  97. int reponse = QMessageBox::warning(this, "Quitter", "Voulez-vous vraiment quitter?", QMessageBox::Yes | QMessageBox::No);
  98. if (reponse == QMessageBox::Yes)
  99. {
  100. QObject::connect(m_oui, SIGNAL(clicked()), qApp, SLOT(quit()));
  101. }
  102. else if (reponse == QMessageBox::No)
  103. {
  104. }
  105.  
  106. }
  107.  
  108. void MaFenetre::propos()
  109. {
  110. QMessageBox::information(this, "A propos", "S1kronize a été développé par <strong>Tib</strong> à l'aide du <a href=\"<a href="http://www.siteduzero.com" target="_blank">http://www.siteduzero.com</a>\">Site du Zéro</a>.<br /> Ce programme s'utilise en parcourant les onglets de gauche à droite. <br />Peut être librement partagé.");
  111. }
  112.  
  113. void MaFenetre::afficher1()
  114. {
  115. QItemSelectionModel *selection1 = vue1->selectionModel();
  116. QModelIndex indexElementSelectionne1 = selection1->currentIndex();
  117. QVariant elementSelectionne1 = modele1->data(indexElementSelectionne1, Qt::DisplayRole);
  118. QMessageBox::information(this, "Elément sélectionné", elementSelectionne1.toString());
  119. origine->setText("Elément d'origine: " + elementSelectionne1.toString());
  120.  
  121.  
  122. }
  123.  
  124. void MaFenetre::afficher2()
  125. {
  126. QItemSelectionModel *selection2 = vue2->selectionModel();
  127. QModelIndex indexElementSelectionne2 = selection2->currentIndex();
  128. QVariant elementSelectionne2 = modele2->data(indexElementSelectionne2, Qt::DisplayRole);
  129. QMessageBox::information(this, "Elément sélectionné", elementSelectionne2.toString());
  130. destination->setText("Elément de destination: " + elementSelectionne2.toString());
  131. }


Je voudrais maintenant récupérer le chemin entier du dossier sélectionné, je me suis renseigné mais je ne trouve pas de réponse...

une idée?

Merci CRicky pour le temps passé ;) 
Expert Programmation

elementSelectionne1 que tu as déclaré dans MaFenetre.h, tu ne l'utilises jamais puisque tu en redéclare un en local de afficher1.
Ensuite, si tu utilise un pointeur, il faut penser à l'allocation et son relâchement.

Sinon, tu n'utilises pas filePath(index) et fileName(index)?
Lassé par la pub ? Créez un compte
Tom's guide dans le monde