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

Multithreading Discussion :

QObject::connect: signal not found


Sujet :

Multithreading

  1. #1
    Membre actif
    QObject::connect: signal not found
    Bonjour,

    je code une fenetre QMainWindow avec un QTableView dans lequel s'affiche un Modele dérivé de QSqlQueryModel.

    Pour garder la main sur l'interface, je fais exécuter la requete dans un QThread à part. La requête est transmise par un signal au QThread.

    Quand le QThread finit son travail il envoie un pointeur du Modele vers ma fenetre et donc mon tableau grâce à un signal.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    connect(p_thread2, &ThreadRequete::signalModeleOK, this, &FenType1::setModeleTableau);



    Tout marche bien en mode DEBUG, mais en RELEASE j'ai un message et mon tableau ne se remplit pas :
    QObject::connect: signal not found in ThreadRequete

    voici mon QThread :
    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
     
    class ThreadRequete : public QThread
    {
        Q_OBJECT
        QString _result;
        QString _requete;
        ModeleType1 *p_modeleTableau;
        QSqlDatabase _conBddActive;
    public:
        explicit ThreadRequete(QSqlDatabase db, QWidget *p_parent = nullptr);
        virtual ~ThreadRequete() override;
        virtual void run() override;
        void setRequete(QString s) {_requete=s;}
        void setModeleTableau(ModeleType1 *md) {p_modeleTableau=md;}
    signals:
        void resultReady(const QString &s);
        void finTache();
        void signalModeleOK(ModeleType1 *p_qsqlqm);
    public slots:
        void requeter(QString requete);
    };




    Je ne comprends pas pourquoi ... Est ce que vous auriez des pistes?

    Merci
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  2. #2
    Membre actif
    Alors j'ai un peu avancé.

    Quand je remplace mon ModeleType1 par un QSqlQueryModel ça marche.
    Mais du coup je n'ai plus les alignements de colonnes puisque je n'ai plus mon QSqlQueryModel personnalisé (qui était ModeleType1)

    voila le code de mon ModeleType1. Je ne vois pas pourquoi ça me bloquerait les signaux du QThread...
    modeletype1.h
    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
     
    #include <QObject>
    #include <QSqlQueryModel>
    #include <QDebug>
     
     
    class ModeleType1 : public QSqlQueryModel
    {
        Q_OBJECT
     
    public:
        explicit ModeleType1(QObject *parent = nullptr);
        //QVariant data(const QModelIndex &index, int role = Qt:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />isplayRole) const override;
     
    };


    modeletype1.cpp
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "modeletype1.h"
     
    ModeleType1::ModeleType1(QObject *parent) : QSqlQueryModel(parent)
    {
        //constructeur
        qDebug()<<"MODELE ON";
    }


    QUelqu'un a une idée?? Je ne vois pas du tout... :-(
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  3. #3
    Modérateur

    Bonsoir,

    Citation Envoyé par katanaenmousse Voir le message
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    connect(p_thread2, &ThreadRequete::signalModeleOK, this, &FenType1::setModeleTableau);


    Tout marche bien en mode DEBUG, mais en RELEASE j'ai un message et mon tableau ne se remplit pas :
    QObject::connect: signal not found in ThreadRequete
    Ce message d'erreur ne correspond pas à la syntaxe de connexion que tu montres, mais à l'ancienne. Ne l'aurais-tu pas modifiée sans recompiler ?
    Toujours est-il que le signal dans la classe ThreadRequete que tu montres est écrit signalModelOK sans « e ».
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  4. #4
    Membre actif
    Oui tu as raison pour le e mais c est une faute de recopie ici dans le forum.
    Pour la syntaxe j ai essayé avec l autre syntaxe aussi mais j obtiens toujours l erreur du signal manquant dans ThreadRequete....
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    connect(p_thread2,SIGNAL(signalModeleOk(ModeleType1*)), this, SLOT(setModeleTableau(ModeleType1*)));


    Ca ne fonctionne pas plus sauf si je remplace dans tout mon code ModeleType1* par QSqlQueryModel*.
    Pourtant je ne vois pas ce qui bloque... Mon ModeleType1 est simplement dérivé de QSqlQueryModel comme je l'ai montré dans le code plus haut.

    Pour garder mon ModeleType1 j'ai fait appel à un signal prédéfini pour la classe QThread : finished(). Ce signal est bien capté par FenType1 donc ça marche comme ça.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    connect(p_thread2,SIGNAL(finished()), this, SLOT(setModeleTableau()));


    Mais j'aurai aimé comprendre pourquoi mon ModeleType1 empêche la détection du signal ThreadRequete::signalModeleOk(ModeleType1*)
    Si quelqu'un peut m'expliquer ça j 'en serai ravi.
    Merci
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  5. #5
    Modérateur

    Et je constate une autre différence aujourd'hui : signalModeleOk avec un « k » minuscule/majuscule.
    Également, attention si tu tiens à utiliser cette syntaxe obsolète, le slot doit être déclaré parmi les slots:, ce qui n'est pas le cas de setModeleTableau() dans le code de ThreadRequete que tu montres.

    Enfin, garde en tête que les paramètres d'entrée reçus par le slot doivent être transmis par le signal. Et QThread::finished() n'en transmet aucun.
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  6. #6
    Membre actif
    SetModeleTableau() n est pas une méthode de ThreadRequete. Il est bien déclaré en spot dans la classe où se déroule le connect. Donc aucun souci là dessus.

    Pour le k c est comme le e une erreur de frappe ici en recopiant .... désolé

    Et pour le fait que finished() ne transmette rien ce n est pas grave parce que j ai accès au pointeur du modèle qui se trouve dans la classe ThreadRequete (je lui ai ajouté une méthode ModeleType1 getModele()
    ;-)
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  7. #7
    Modérateur

    Je sais qu'il s'agit d'une autre classe, mais tu ne l'as pas montrée, donc je fais avec ce que tu me donnes...
    OK d'un côté et Ok de l'autre ? Pas top.
    Serait-il donc possible d'avoir le code exact, minimal et complet qui permet de reprodure le problème ? Et le message d'erreur avec les deux syntaxes ?
    Toujours est-il que pour le message que tu montres, les raisons sont données dans ce sujet (applicable au signaux).
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  8. #8
    Expert éminent sénior
    Salut,
    Citation Envoyé par katanaenmousse Voir le message

    Pour garder la main sur l'interface, je fais exécuter la requete dans un QThread à part. La requête est transmise par un signal au QThread.
    Ca, ca me parait un peu bizarre...

    Car, que tu fournisse le modèle à un thread pour que ce dernier puisse le manipuler, ca, ca me paraitrait sensé, mais, ton modèle, il est -- typiquement -- forcément associé ... à une (ou plusieurs) vue(s), si bien que tu n'aurais, a priori, qu'à forcer le modèle à émettre un signal de fin d'édition juste avant que le thread ne rende la main.

    Attention, je ne dis pas que ton montage est incorrect (d'autant plus qu'avec ce que tu nous donne, il est très difficile de s'en faire une idée précise), mais je dis que tu t'es sans doute (inutilement) cassé la tête sur un construction qui est beaucoup plus complexe que nécessaire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

###raw>template_hook.ano_emploi###