Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QT] Problème d'Historique

Sujet résolu
    4 mars 2015 à 9:18:09

    Bonjour tout le monde, j'ai une question auquel je n'arrive pas à trouver de réponse, bien que je sois convaincu de la simplicité du problème :

    Réalisant un navigateur internet, j'ai créé une classe Historique toute bête. Mon problème est le suivant. Dans "InitializeHistorique", lorsque chaque élément du QWebHistory est changé en bouton, je ne trouve aucun moyen pour lier le "btn" créé soit "lié" à une URL en particulier (afin que lorsqu'on clique dessus, l'url soit transmise à une autre classe etc.).

    #include <QtWidgets>
    #include <QtWebKitWidgets>
    #include "monhistorique.h"
    
    //constructeur
    MonHistorique::MonHistorique()
    {
        setWindowTitle(tr("Historique"));
        setWindowIcon(QIcon("images/historique.png"));
        setFixedSize(300,300);
    }
    
    void MonHistorique::closeEvent()
    {
    
         emit aboutToClose(true);
    }
    
    void MonHistorique::setListeHistorique(QList<QWebHistoryItem> QI_Item)
    {
        ListeHistorique = QI_Item;
    }
    
    QWebHistoryItem MonHistorique::getListeHistorique(int index)
    {
        return ListeHistorique.at(index);
    }
    
    void MonHistorique::InitializeHistorique(int ItemCount)
    {
    
            int i;
            for(i = 0; i < ItemCount ; i++)
            {
                if(getListeHistorique(i).url().toString() != "")
                 {
                     ListeURL.push_back(getListeHistorique(i).url());
                     str_historique += getListeHistorique(i).url().toString();
                     str_historique += "";
    
                     QPushButton* btn = new QPushButton(this);
                     btn->setText(getListeHistorique(i).title().left(40));
                     btn->setGeometry(0, (i*30), 300, 30);
                     btn->setToolTip(ListeURL.at(i).toString());
                     urlClicked = getListeHistorique(i).url();
                     QObject::connect(btn, SIGNAL(clicked()), this, SLOT(historiqueClick()));
    
    
    
                     ListeBoutons.push_back(btn);
    
    
    
                }
            }
    
    }
    
    QUrl MonHistorique::getUrlClicked()
    {
    
        return urlClicked;
    }
    
    //SLOT
    
    void MonHistorique::historiqueClick()
    {
    
        emit historiqueClicked();
        emit signalurl(urlClicked);
    
    }
    

    J'ai bien tenté d'utiliser un slot à chaque clic (historiqueClick()) pour transmettre "urlClicked" via "signalurl()"... Le seul problème c'est qu'à chaque tour de boucle, urlClicked change, et finit par ne plus contenir que la dernière page enregistré dans l'historique.

    D'où ma question : Comment, à la pression du bouton, transmettre une url lié ?
    Merci d'avance d'une réponse rapide

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      4 mars 2015 à 14:32:19

      Tu pourrais t'en sortir tout bêtement en mettant l'url dans le tooltip du boutton !
      • Partager sur Facebook
      • Partager sur Twitter
        4 mars 2015 à 14:47:00

        Merci pour ta réponse. effectivement c'était plutôt simple : Mais un problème persiste, comment connecter le clic du bouton à un envoi de l'url ? car :

        QObject::connect(bouton, SIGNAL(clicked()), this, SLOT(OuvrePage(QUrl)));
        ne peut pas fonctionner (à cause de la valeur entre parenthèse).
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          4 mars 2015 à 16:00:38

          2 solutions:

          soit tu fait une classe cstom qui hérite de QPushButton, soit tu fait OuvrePage() sas arguments et tu récupére le boutton avec sender() que tu cast après, et tu pourras ainsi récupérer son tooltip ;)

          • Partager sur Facebook
          • Partager sur Twitter
            4 mars 2015 à 16:13:37

            Ou soit tu utilises une fonction lambda :

            connect(bouton, &QPushButton::clicked, this, [&](){ ouvrePage(urlClicked); });

            Cf Les signaux et slots dans Qt 5.4

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              4 mars 2015 à 20:52:35

              Ouhh là, c'est quoi ça ? o_O
              • Partager sur Facebook
              • Partager sur Twitter
                4 mars 2015 à 20:54:54

                http://fr.cppreference.com/w/cpp/language/lambda

                • Partager sur Facebook
                • Partager sur Twitter
                  5 mars 2015 à 10:13:27

                  Super ! Grâce à vos conseils j'ai pu régler le problème de cette façon :

                  1. En mettant l'url dans le tooltip du Bouton lors de l'inialisation présenté plus haut :

                  void MonHistorique::InitializeHistorique(int ItemCount)
                  {
                           IC = ItemCount;
                  
                          int i;
                          for(i = 0; i < ItemCount ; i++)
                          {
                              if(getListeHistorique(i).url().toString() != "")
                               {
                                   ListeURL.push_back(getListeHistorique(i).url());
                                   QPushButton* btn = new QPushButton(this);
                                   btn->setText(getListeHistorique(i).title().left(40));
                                   btn->setGeometry(0, (i*30), 300, 30);
                                   btn->setToolTip(ListeURL.at(i).toString()); // <--- ICI
                                   ListeBoutons.push_back(btn);
                  
                              }
                          }

                  Et lors de son utilisation, en optant pour la solution du cast dynamique sur le sender :

                  QObject::connect(historique->getBouton(i), SIGNAL(clicked()), SLOT(ouvrirUnLienViaHistorique()));

                   Puis

                  void MaFenetre::ouvrirUnLienViaHistorique()
                  {
                  
                      QPushButton* boutonUrl = dynamic_cast<QPushButton*>(sender()); // <-- ICI
                      pageActuelle()->load(QUrl(boutonUrl->toolTip()));
                  
                  }

                  (Je préfère écrire la solution, je ne supporte pas ses topics où le mec dit juste "C'est réglé lel").
                  Voilà voilà. Merci Infiniment 'w'




                  -
                  Edité par BolekNetz 5 mars 2015 à 10:16:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    5 mars 2015 à 10:17:58

                    tu peux utiliser qobject_cast à la place de dynamic_cast !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [QT] Problème d'Historique

                    × 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