IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Menu QAction vers fonction(QString)

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Menu QAction vers fonction(QString)
    Bonjour,
    Je cherche à créer un menu dans lequel je met une liste dont chaque clic sur un élément appellera une fonction qui a un QString en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach( QextPortInfo item, liste_ports )
         {
            QAction *action = new QAction(item.physName, this);
            action->setVisible(false);
            ui->menuPort->addAction(item.physName);
         }
         connect(ui->menuPort, SIGNAL(triggered(QAction *)),
                 this, SLOT(init_port(QAction.text() *)), Qt::UniqueConnection);
    Ce qui est inscrit ci-dessus ne marche pas. Et je pense que le problème vient d'ici : SLOT(init_port(QAction.text() *))
    Seulement je ne trouve pas comment écrire le fait que init_port() soit appelé en lui donnant le bon paramètre.

    Sauriez vous ce que je devrais mettre ?
    Merci d'avance de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    C'est faisable avec la classe QSignalMapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    QSignalMapper *signalMapper = new QSignalMapper(this);
    foreach( QextPortInfo item, liste_ports )
    {
        QAction *action = new QAction(item.physName, this);
        action->setVisible(false);
        ui->menuPort->addAction(item.physNameaction);
        connect(action, SIGNAL(triggered()), signalMapper, SLOT(map()));
        signalMapper->setMapping(action, item.physName);
    }
    connect(signalMapper, SIGNAL(mapped(const QString &)),
            this,         SLOT(init_port(const QString &)) );
    [EDIT] Correction item.physName => action
    Dernière modification par Invité ; 11/05/2014 à 21h42.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Merci pour l'aide.
    En revanche, j'ai toujours une erreur à l'execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object::connect: No such slot MainWindow::init_port(const QString &) in ../test_led_arduino/mainwindow.cpp:51
    Je l'ai pourtant déclarée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MainWindow::init_port(const QString &dev_port)

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Je pense qu'il ne faut pas indiquer le const et le & lors de la connexion signal/slot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connect(signalMapper, SIGNAL(mapped(QString)),
    this, SLOT(init_port(QString)) );

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est je pense surtout dû au fait que dans le premier code présenté, le slot init_port prend quelque chose de bizarre SLOT(init_port(QAction.text() *)) qui n'est sûrement pas un QString.

    @tymop : As-tu pensé à créer un tel slot dans ta classe MainWindow avec la signature suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void init_port(QString const & physName);
    ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Bonsoir,

    As-tu pensé à créer un tel slot dans ta classe MainWindow avec la signature suivante
    Non, je l'ai déclaré comme marqué plus haut void MainWindow::init_port(const QString &dev_port)

    J'ai aussi essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(init_port(QString)) );
    mais ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object::connect: No such slot MainWindow::init_port(QString) in ../test_led_arduino/mainwindow.cpp:51
    Note : j'ai essayé la déclaration "init_port(QString const & dev_port)" mais c'est pareil

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tymop
    Non, je l'ai déclaré comme marqué plus haut void MainWindow::init_port(const QString &dev_port)
    Cela me semble bon, pourrais-tu nous en montrer plus ?

    Un nettoyage/recompilation est peut-être nécessaire..

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Un nettoyage/recompilation est peut-être nécessaire..
    je recompile à chaque modification. qu'est le Nettoyage ?
    pourrais-tu nous en montrer plus ?
    voici la fonction init_port
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    void MainWindow::init_port(QString const & dev_port)
    {
        //QString dev_port = "/dev/ttyUSB0";
        qDebug() << "Port :" << dev_port ;
        COM_Open = false;
     
        port = new QextSerialPort(dev_port); //on ouvre le port
        // ls /dev/ | grep USB   << Permet de donner la liste des périphériques USB
     
         port->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
        if(!port->isOpen())
        {
           QMessageBox::warning(this, "Impossible d'ouvrir le port", dev_port);
        }
     
        // On parametre la liaison :
        port->setBaudRate(BAUD9600);
        port->setFlowControl(FLOW_OFF);
        port->setParity(PAR_NONE);
        port->setDataBits(DATA_8);
        port->setStopBits(STOP_1);
     
        connect(port, SIGNAL(readyRead()), this, SLOT(onDataAvailable()));
        COM_Open = true;
     
    }
    et le code ou le menu est créé et ou je cherche à faire la connection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        Val1=0;
        Val2=0;
        Val3=0;
        temps=0;
        timer = new QTimer(this);
     
        ui->setupUi(this);
     
        // On connecte le mouvement du bouton a l'envoi de la commande
        //connect(ui->Slider1, SIGNAL(sliderMoved(int)), this, SLOT(transmitCmd(int)));
        connect(ui->Slider1, SIGNAL(sliderMoved(int)), this, SLOT(MAJ_Val1(int)));
        connect(ui->Slider2, SIGNAL(sliderMoved(int)), this, SLOT(MAJ_Val2(int)));
        connect(ui->Slider3, SIGNAL(sliderMoved(int)), this, SLOT(MAJ_Val3(int)));
        connect(ui->checkBoxAuto, SIGNAL(stateChanged(int)), this, SLOT(Conf_timer()));
        connect(ui->vitesse_timer, SIGNAL(sliderMoved(int)), this, SLOT(Conf_timer()));
        connect(ui->dial, SIGNAL(sliderMoved(int)), this, SLOT(set_Temps(int)));
        connect(timer, SIGNAL(timeout()), this, SLOT(effet()));
        timer->start(ui->vitesse_timer->value());
     
        // Menu liste des portcom
        QList<QextPortInfo> liste_ports = QextSerialEnumerator::getPorts();
        QSignalMapper *signalMapper = new QSignalMapper(this);
        foreach( QextPortInfo item, liste_ports )
        {
            QAction *action = new QAction(item.physName, this);
            action->setVisible(false);
            ui->menuPort->addAction(item.physName);
            connect(action, SIGNAL(triggered()), signalMapper, SLOT(map()));
            signalMapper->setMapping(action, item.physName);
        }
        connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(init_port(QString)) );
     
     
     //   init_port("/dev/ttyUSB0"); //initiation of the port
     //   connect(port, SIGNAL(readyRead()), this, SLOT(onDataAvailable()));
    }
    S'il y a d'autres bouts de codes qui intéressent, dites le .

    PS : soyez indulgent, c'est mon premier code qt

  9. #9
    Invité
    Invité(e)
    Par défaut
    Le nettoyage est la suppression de tous les fichiers générés lors de l'étape de la compilation. Si tu travailles sous Qt Creator, c'est dans le même menu que lorsque tu compiles : "Compiler" > "Nettoyer le projet".

    Le code que tu montres semble bon... si dans ton fichier mainwindow.h tu as bien déclaré ton slot comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MainWindow {
     
        // ...
     
    public slots:
        void init_port(QString const & dev_port);
     
    };
    Alors cela devrait être bon.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    si dans ton fichier mainwindow.h tu as bien déclaré ton slot comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MainWindow {
     
        // ...
     
    public slots:
        void init_port(QString const & dev_port);
     
    };
    Alors cela devrait être bon.
    Bon, tu as mis le doit sur quelque chose : j'avais mis dans "public" et non dans "public slot".
    Je n'ai plus le message d'erreur, mais ce n'est pas fonctionnel : la fonction n'est pas appelée lorsque je clic sur les éléments qui le composent

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Je ne trouve pas du tout. Pouvez vous me donner un coup de main pour comprendre:

    Est ce qu'on peut dire que cette ligne de code appelle la fonction init_port en lui donnant un paramètre de type QString, lorsqu'on clic sur un des choix dans le menu menuPort, et que ce QString est le texte de la ligne sur laquelle on a cliqué ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(init_port(QString)) );
    Si c'est ça, ça ne marche pas : j'ai mis un point d'arrêt au début de la fonction init_port, et jamais je ne l'atteint.

    Si j’interprète mal, pouvez vous me dire ce que ce code fait ?

    Merci d'avance de votre aide.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Oui c'est exactement ça, par contre, chose à laquelle je n'avais pas prêté attention, tu n'ajoutes pas le QAction que tu viens de créer et lier, mais juste le texte, ce qui en crée derrière un totalement différent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->menuPort->addAction(item.physNameaction);

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Résolu
    C'était bien cela.
    Merci pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage de graphique vers fonction
    Par thechakib dans le forum MATLAB
    Réponses: 1
    Dernier message: 09/05/2007, 16h05
  2. menu personalisé en fonction des utilisateurs
    Par valer dans le forum Delphi
    Réponses: 2
    Dernier message: 27/10/2006, 09h02
  3. [PHP-JS] Passage de paramètre de Javascript vers fonction Php
    Par winnie82 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/07/2006, 10h06
  4. [JSP] Mise à jour d'un menu déroulant en fonction d'un autre
    Par Lady_jade dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/12/2005, 13h32
  5. Pointeur vers fonction
    Par flopaname dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2005, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo