Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de SLOT

pour trier QTableWidget

Sujet résolu
    3 mars 2008 à 9:55:36

    Bonjour,
    Je souhaite trier un tableau de type QTableWidget par un clic sur un bouton.
    Mais il ne se passe rien.
    Voici mon code.

    IHM.h
    1. class IHM : public QWidget
    2. {
    3.     Q_OBJECT
    4.     public:
    5.     IHM();
    6.     public slots:
    7.     void trierTableau();
    8.     private:
    9.     QTableWidget *tableau;
    10.     ...
    11.     QPushButton *boutonProgramme;
    12. }


    IHM.cpp
    1. IHM::IHM() : QWidget()
    2. {
    3.     setFixedSize(1020,745);
    4.     ...
    5.     tableau = new QTableWidget(30, 8, this);
    6.     tableau->setGeometry(150,150,800,550);
    7.     tableau->setFont(QFont("Microsoft Sans Serif", 8));
    8.     ...
    9.     boutonProgramme = new QPushButton("Programme", this);
    10.     boutonProgramme->setGeometry(10,150,100,30);
    11.     connect(boutonProgramme, SIGNAL (clicked()), tableau, SLOT (trierTableau()));
    12.     ...
    13. }
    14. void IHM::trierTableau()
    15. {
    16.     tableau->setSortingEnabled(true);
    17.     tableau->sortItems(1, Qt::AscendingOrder);
    18. }


    Merci de m'aider.
    • Partager sur Facebook
    • Partager sur Twitter
      3 mars 2008 à 10:32:53

      Ton erreur se trouve dans l'appel de la fonction connect() ;)
      Il te faut faire :

      1. connect(boutonProgramme, SIGNAL (clicked()), this, SLOT (trierTableau()));


      En effet le troisième argument est, pour citer le cour de M@teo21, :

      Citation : M@teo21

      Un pointeur vers l'objet qui contient le slot récepteur.



      Or dans ton cas, c'est ta classe qui contient le slot, non pas l'objet tableau ^^ il te faut donc mettre this qui renvoi un pointeur vers l'objet actuel :)
      • Partager sur Facebook
      • Partager sur Twitter
        3 mars 2008 à 11:26:27

        En fait je m'en étais aperçu et j'avais corrigé. ;)
        J'aurais du éditer. Désolé.

        Néanmoins mon problème n'est pas résolu car il ne se passe toujours rien.

        Dois-je créer une classe tableau qui hérite de QTableWidget pour y insérer :
        1. public slots :
        2. void tableau::trierTableau()


        Car là je pense que ce qui me bloque c'est le fait que le slot soit "hébergé" par ma classe IHM alors que l'objet récepteur est censé être mon tableau.

        Quelqu'un pour éclaircir ce point ?

        • Partager sur Facebook
        • Partager sur Twitter
          3 mars 2008 à 11:35:08

          Non a priori tu n'es absolument pas tenu de faire hériter un widget de QTableWidget pour y insérer ton slot. Si tu fais ça dans ta classe IHM ça marche très bien, du temps qu'elle possède un pointeur vers le tableau (et c'est le cas).

          A mon avis le problème est ailleurs. Commence déjà par vérifier si le programme "entre" dans le slot, en affichant par exemple une QMessageBox au début du slot. Si la boîte de dialogue apparaît, c'est que le slot est lu mais que les méthodes du tableau que tu as appelées (sortItems etc) sont mal utilisées ou insuffisantes pour produire le résultat que tu attends. Je ne connais pas QTableWidget je ne peux pas t'aider plus à ce niveau.
          • Partager sur Facebook
          • Partager sur Twitter

          If you'd like to join us, read "How do we work at OpenClassrooms"! :)

            3 mars 2008 à 12:42:42

            Merci M@teo

            Tu m'as fait bidouiller mon code et je me suis aperçu de l'erreur en regardant le chapitre sur les boîtes de dialogue.
            En corrigeant dans mon IHM.cpp la ligne du connect (j'ai remplacé tableau par this pour l'objet récepteur), j'ai aussi modifié le IHM.h :
            1. void IHM::trierTableau();

            Au lieu de :
            1. void trierTableau();


            D'où l'intérêt de ne faire qu'une modif à la fois.

            Encore merci à tout le monde. ;)
            • Partager sur Facebook
            • Partager sur Twitter

            Problème de SLOT

            × 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