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 :

Connecter un slot du widget parent

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Connecter un slot du widget parent
    Hello,

    Je tente de connecter un slot se trouvant dans le widget 'conteneur', à partir d'un signal du widget 'child' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(toggleBigSmall, SIGNAL(clicked()),this->parentWidget(), SLOT(hideOthers(SubWindow&)));
    J'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect: Cannot connect QPushButton::clicked() to (null)::hideOthers(SubWindow&)
    Que fais-je faux !

    Il faut dire que je suis très débutant.

    A+

    Gilles

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 774
    Par défaut


    Le problème, c'est les arguments : tu connectes un signal sans argument à un slot avec argument. Tu veux qu'il sorte d'où, cet argument ?

    Voir http://qt.developpez.com/tutoriels/introduction-qt/ et http://matthieu-brucher.developpez.c...t/signal-slot/ .
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut
    Hello Dourou,

    Merci pour ta prompte réponse. J'aurais espérer quelque chose de plus ciblé. Cependant, il est vrai, il faut que je bouquine quelque peu !!

    A+

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Tu vas chercher trop compliqué mon cher dourouc :p Déjà faudrait commencer par connecter des objets et des slots qui existent.

    L'erreur dit clairement que parentWidget() est null (j'en conclus que this est ta fenêtre principale).
    Ensuite même s'il n'était pas null, hideOthers(SubWindow&) n'est pas un slot qui existe dans QWidget.
    Et enfin y'a le problème des arguments, un slot qui attend des arguments ne peut être appelé que par un signal qui les transporte.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut this.parentwidget
    Re,

    J'en suis arrivé à la conclusion de this->parentWidget() est null, en effet...

    Ceci étant appelé au sein d'un widget 'child', pourquoi est-t-il null ?

    Ah, j'y arriverai un jour, j'y arriverais.

    A+

    Gilles

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut ...
    La source du widget 'parent' est ainsi fait.
    Le fait d'insérer un widget dans un autre (avec addwidget) est-il ok pour ensuite récupérer une valeur non-nulle avec parentwidget() ?

    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
    #include <QtGui>
     
    #include "glwidget.h"
    #include "window.h"
     
    Window::Window()
    {
     
        profil=new SubWindow();
        single = new SubWindow();
        compound =new SubWindow();
        machining = new SubWindow();
     
        QGridLayout *mainLayout = new QGridLayout;
     
     
        mainLayout->addWidget(profil,0,0);
        mainLayout->addWidget(single,0,1);
        mainLayout->addWidget(compound,1,1);
        mainLayout->addWidget(machining,1,0);
        setLayout(mainLayout);
     
        setWindowTitle(tr("AutoCalc"));
    }
     
    void Window::hideOthers(SubWindow& monsub){
        monsub.hide();
     
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Connecter un slot du widget parent
    Hello,

    Je tente de réaliser la connection d'un signal du widget 'Child' au slot du widget 'Parent', ce en utilisant parentWidget().

    L'instruction parentWidget() me retourne null.

    D'ou l'erreur :

    QObject::connect: Cannot connect SubWindow::clicked(SubWindow&) to (null)::hideOthers(SubWindow&)

    Pourquoi ?
    Comment faire ?

    Merci pour vos réponses !

    Gilles


    Implémentation du 'child' :

    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
     
     
    #include <QtGui>
     
    #include "glwidget.h"
    #include "subWindow.h"
     
    //! [0]
    SubWindow::SubWindow()
    {
     
        glwidget = new GLWidget();
     
        groupeBouton=new QGroupBox();
        groupeBouton->setMaximumWidth(80);
        scrollVertical=new QScrollBar();
        scrollVertical->setOrientation(Qt::Vertical);
        scrollHorizontal=new QScrollBar();
        scrollHorizontal->setOrientation(Qt::Horizontal);
     
        toggleBigSmall=new QPushButton(groupeBouton);
     
        connect(this, SIGNAL(clicked(SubWindow&)),this->parentWidget(), SLOT(hideOthers(SubWindow&)));
     
        QGridLayout *mainLayout = new QGridLayout;
     
        mainLayout->addWidget(glwidget,0,0);
        mainLayout->addWidget(scrollVertical,0,1);
        mainLayout->addWidget(groupeBouton,0,2);
        mainLayout->addWidget(scrollHorizontal,1,0);
     
        setLayout(mainLayout);
     
        setWindowTitle(tr("AutoCalc"));
    }
    Ici, l'implémentation du widget parent :

    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
     
     
    #include <QtGui>
     
    #include "glwidget.h"
    #include "window.h"
     
    Window::Window()
    {
     
        profil=new SubWindow();
        single = new SubWindow();
        compound =new SubWindow();
        machining = new SubWindow();
     
        QGridLayout *mainLayout = new QGridLayout;
     
     
        mainLayout->addWidget(profil,0,0);
        mainLayout->addWidget(single,0,1);
        mainLayout->addWidget(compound,1,1);
        mainLayout->addWidget(machining,1,0);
        setLayout(mainLayout);
     
        setWindowTitle(tr("AutoCalc"));
     
        //qDebug() << "Parent: " << profil->parentWidget();
    }
     
    void Window::hideOthers(SubWindow& monsub){
        monsub.hide();
     
    }

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Que dit la doc ?
    http://qt-project.org/doc/qt-4.8/qlayout.html#addWidget
    Citation Envoyé par addWidget()
    Adds widget w to this layout in a manner specific to the layout. This function uses addItem().
    Citation Envoyé par addItem()
    Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.
    http://qt-project.org/doc/qt-4.8/qwidget.html#setLayout
    Citation Envoyé par setLayout()
    The QWidget will take ownership of layout.
    Sinon sans ces mécanismes implicites dont apparemment tu n'avais pas connaissance, tu ne crées aucune filiation, vu que tu n'utilises jamais les constructeurs qui la font. La preuve, ton code ne parle nulle part de "parent".

    Normalement, si tu crées bien ton projet avec Qt Creator, ou si tu suis n'importe quel tutoriel, tu as des choses comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Window::Window(QWidget* parent) : QWidget ( parent ) // ClasseMereDeWindow ( parent )
    {
        // transmission du lien de parenté par le constructeur de la même manière
        profil=new SubWindow( this );
        single = new SubWindow( this );
        compound =new SubWindow( this );
        machining = new SubWindow( this );
    }
    Donc là dans ton code y'a aucune notion de Parent et Child qui apparait. Cette notion est propre au framework Qt (aux QObject), et n'a rien à voir avec le C++, l'endroit du code où tu crées les objets, l'héritage, etc.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Yes !
    Cela fonctionne maintenant !

    Je dois bouquiner !

    Merci bien.

    Gilles

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

Discussions similaires

  1. Connecter les slots ?
    Par bioinfornatics dans le forum PyQt
    Réponses: 2
    Dernier message: 28/07/2009, 15h42
  2. [Qt4-Win] Connect (SIGNAL/SLOT)
    Par mikemarti dans le forum Débuter
    Réponses: 5
    Dernier message: 20/06/2008, 02h05
  3. Problème de connect (signal/slots)
    Par Alain Defrance dans le forum Qt
    Réponses: 5
    Dernier message: 20/03/2008, 21h58
  4. [Swt]Prendre toute la place du Widget Parent ?
    Par kedare dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 17/03/2006, 15h45

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