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

Multithreading Discussion :

QObject::connect: signal not found


Sujet :

Multithreading

  1. #1
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut 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

  2. #2
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    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::DisplayRole) 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... :-(

  3. #3
    Invité
    Invité(e)
    Par défaut
    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 ».

  4. #4
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    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

  5. #5
    Invité
    Invité(e)
    Par défaut
    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.

  6. #6
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    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()
    ;-)

  7. #7
    Invité
    Invité(e)
    Par défaut
    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).

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    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

Discussions similaires

  1. QObject::connect: No such signal QRadioButton::checked()
    Par Claudio033 dans le forum Débuter
    Réponses: 12
    Dernier message: 01/01/2017, 20h39
  2. Réponses: 6
    Dernier message: 31/03/2015, 12h59
  3. Réponses: 4
    Dernier message: 25/03/2011, 08h48
  4. [VBA] BOXI: Connection name not found
    Par silahi dans le forum SDK
    Réponses: 2
    Dernier message: 26/05/2010, 11h29
  5. probleme QObject::connect SLOT/SIGNAL
    Par sebatlante dans le forum Qt
    Réponses: 3
    Dernier message: 22/03/2008, 11h39

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