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 :

Signal d'une fenêtre fille vers slot d'une fenêtre mère

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut Signal d'une fenêtre fille vers slot d'une fenêtre mère
    Salut tout le monde,

    j'ai un petit problème : je cherche (comme indiqué dans l'intitulé de mon topic) à transmettre une information d'une fenêtre fille (de type QDialog) à une fenêtre mère (de type QMainWindow) au moyen de signal et de slot.

    J'ai redigé un programme simple pour chercher à mettre cela en pratique mais ça ne marche pas, j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect: No such slot Window::transmettre_text() in ...
    Avez vous une idée du problème ?

    Par ailleurs j'ai une autre erreur que je ne comprend pas (Mais elle n'a 'visiblement' pas d'impact) : quand je compile j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create: CreateWindowEx failed (Impossible de créer une fenêtre enfant supérieure.)
    J'ai un peu cherché mais je ne vois pas à quoi cela correspond.

    Voici mon code :

    mainwindow.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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QLabel>
     
    #include "Window.h"
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    public slots:
        void mon_text1(QString& texte);
        void fenetre();
     
     
    private:
        QLabel *label;
    };
     
    #endif // MAINWINDOW_H
    mainwindow.cpp

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include "mainwindow.h"
    #include "MyPanelOpenGL.h"
    #include "Window.h"
     
    #include <QSpinBox>
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
        setGeometry(500,500,300,200);
     
        QSpinBox *spinbox_sides = new QSpinBox;
        QSpinBox *spinbox_radius = new QSpinBox;
     
        spinbox_sides->setValue(3);
        spinbox_radius->setValue(3);
     
        MyPanelOpenGL *gl = new MyPanelOpenGL(spinbox_sides->value(),spinbox_radius->value(),this);
     
        QPushButton *button = new QPushButton("Click");
     
        label = new QLabel("Salut");
     
        QGroupBox *groupe_box = new QGroupBox;
     
        QGridLayout *layoutGridNouveautes = new QGridLayout;
        layoutGridNouveautes->addWidget(spinbox_sides, 1, 0);
        layoutGridNouveautes->addWidget(spinbox_radius, 1, 1);
        layoutGridNouveautes->addWidget(gl, 0, 0);
        layoutGridNouveautes->addWidget(button, 2, 1);
        layoutGridNouveautes->addWidget(label, 2, 0);
     
        groupe_box->setLayout(layoutGridNouveautes);
     
        setCentralWidget(groupe_box);
     
     
     
        //connect les Spin box avec la fonction de changement de rayon
     
        connect(spinbox_sides, SIGNAL(valueChanged(int)),gl,SLOT(changeSides(int)));
        connect(spinbox_radius, SIGNAL(valueChanged(int)),gl,SLOT(changeRadius(int)));
     
        connect(button, SIGNAL(clicked()),this,SLOT(fenetre()));
     
    }
     
    MainWindow::~MainWindow()
    {
     
    }
     
    void MainWindow::fenetre()
    {
    //    Window salut;
     
    //    salut.exec();
     
        Window *salut = new Window(this);
     
     
     
        salut->show();
        salut->activateWindow();
     
        connect(salut, SIGNAL(mon_text(QString)),this, SLOT(mon_text1(QString)));
    }
     
    void MainWindow::mon_text1(QString &texte)
    {
        label->setText(texte);
    }
    MyPanelOpenGL.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
    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
    #ifndef MYPANELOPENGL_H
    #define MYPANELOPENGL_H
     
     
    #include <QtOpenGL>
    #include <QGLWidget>
     
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <gl\glaux.h>
     
    class MyPanelOpenGL : public QGLWidget
    {
     
        Q_OBJECT
     
    public:
        MyPanelOpenGL(int m_sides, int m_radius, QWidget *parent = 0);
     
    protected:
        void initializeGL();
        void resizeGL(int width, int height);
        void paintGL();
     
     
     
    private:
        int sides;
        int radius;
     
    public slots:
        void changeSides(int s);
        void changeRadius(int r);
     
    };
     
     
     
     
    #endif // MYPANELOPENGL_H
    MyPanelOpenGL.cpp

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include "MyPanelOpenGL.h"
     
    MyPanelOpenGL::MyPanelOpenGL(int m_sides, int m_radius, QWidget *parent)
        : QGLWidget(parent)
    {
        sides = m_sides;
        radius = m_radius;
     
     
    //    sides = 3;
    //    radius = 1.0;
    }
     
    void MyPanelOpenGL::initializeGL()
    {
        glShadeModel(GL_SMOOTH);
        glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
        glClearDepth(1.0f);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
        glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    }
     
    void MyPanelOpenGL::resizeGL(int width, int height)
    {
        double xMin = 0, xMax = 10, yMin = 0, yMax = 10;
     
        glViewport(0,0,width, height);
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(-1,1,-1,1);
        if (width > height)
        {
            height = height?height:1;
            double newWidth = (xMax - xMin) * width / height;
            double difWidth = newWidth - (xMax - xMin);
            xMin = 0.0 + difWidth / 2.0;
            xMax = 10 + difWidth / 2.0;
        }
        else
        {
            width = width?width:1;
            double newHeight = (yMax - yMin) * width / height;
            double difHeight = newHeight - (yMax - yMin);
            yMin = 0.0 + difHeight / 2.0;
            yMax = 10 + difHeight / 2.0;
        }
     
        gluOrtho2D(xMin, xMax, yMin, yMax);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
     
    void MyPanelOpenGL::paintGL()
    {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glTranslated(5.0, 5.0, 0.0);
     
        glLineWidth(1);
        glColor3f(0, 0.7f, 0.7f);
     
        glBegin(GL_POLYGON);
     
        for (int i = 0; i < sides; i++)
        {
            glVertex2f(radius*cos(i*2*3.14159265/sides),radius*sin(i*2*3.14159265/sides));
        }
     
        glEnd();
     
        glLineWidth(2);
        glColor3f(0, 1, 0);
     
        glBegin(GL_LINE_LOOP);
     
        for (int i = 0; i < sides; i++)
        {
            glVertex2f(radius*cos(i*2*3.14159265/sides),radius*sin(i*2*3.14159265/sides));
        }
     
        glEnd();
    }
     
    void MyPanelOpenGL::changeSides(int s)
    {
        sides = s;
     
        updateGL();
    }
     
    void MyPanelOpenGL::changeRadius(int r)
    {
        radius = r;
     
        updateGL();
    }
    Window.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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #ifndef WINDOW_H
    #define WINDOW_H
     
    #include <QDialog>
    #include <QLineEdit>
     
    class Window : public QDialog
    {
        Q_OBJECT
     
        public:
        Window(QWidget *parent);
     
        public slots:
        void transmettre_text();
     
        signals:
        void mon_text(QString& texte);
     
        private:
        QLineEdit *lineedit;
     
    };
     
    #endif // WINDOW_H
    Window.cpp

    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
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include "Window.h"
    #include "MyPanelOpenGL.h"
     
    #include <QSpinBox>
     
    Window::Window(QWidget *parent)
    {
        setGeometry(500,500,300,200);
     
        QSpinBox *spinbox_sides = new QSpinBox;
        QSpinBox *spinbox_radius = new QSpinBox;
     
        spinbox_sides->setValue(3);
        spinbox_radius->setValue(3);
     
        MyPanelOpenGL *gl = new MyPanelOpenGL(spinbox_sides->value(),spinbox_radius->value(),this);
     
        lineedit = new QLineEdit("Done");
        QPushButton *button = new QPushButton("Push");
     
        QGridLayout *layoutGridNouveautes = new QGridLayout;
        layoutGridNouveautes->addWidget(spinbox_sides, 1, 0);
        layoutGridNouveautes->addWidget(spinbox_radius, 1, 1);
        layoutGridNouveautes->addWidget(gl, 0, 0);
        layoutGridNouveautes->addWidget(lineedit, 2, 0);
        layoutGridNouveautes->addWidget(button, 2, 1);
     
        setLayout(layoutGridNouveautes);
     
     
     
        //connect les Spin box avec la fonction de changement de rayon
     
        connect(spinbox_sides, SIGNAL(valueChanged(int)),gl,SLOT(changeSides(int)));
        connect(spinbox_radius, SIGNAL(valueChanged(int)),gl,SLOT(changeRadius(int)));
     
        connect(button, SIGNAL(clicked()),this,SLOT(transmettre_text()));
     
        connect(button, SIGNAL(clicked()),this,SLOT(accept()));
    }
     
    void Window::transmettre_text()
    {
        QString text = lineedit->text();
     
        emit mon_text(text);
    }
    Merci d'avance pour votre temps

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Je ne vois pas pourquoi il ne trouve pas le slot. Est-ce bien dans la classe Window, qu'il recherche ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    salut->activateWindow();
    En quoi cela vous semble utile ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Il recherche le slot dans Window et le signal dans mainwindow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QObject::connect: No such slot Window::transmettre_text() in ..\Projet\Window.cpp:37
    QObject::connect: No such signal Window::mon_text(QString) in ..\Projet\mainwindow.cpp:71
    En effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        salut->activateWindow();
    n'est pas utile =/, il me semblait que lorsque l'on créait un pointeur sur une fenetre elle ne restait pas active avec simplement show() mais visiblement si

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    Il faut régler ces problèmes de slots, mais je ne les comprends pas. Pouvez vous relancer qmake, et nettoyer le projet pour le reconstruire (recompiler complètement).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    C'est fait, vous aviez raison l'erreur concernant le slot a disparue mais pas celle concernant le signal

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    J'ai trouvé mon erreur ! Dans la définition de mon signal et de mon slot, l'argument était une référence (QString&) alors que dans mon connect non (QString) ! C'est soit l'un soit l'autre ^^

    Maintenant est ce que quelqu'un voit comment résoudre cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create: CreateWindowEx failed (Impossible de créer une fenêtre enfant supérieure.)

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    N'y a t-il pas des widgets qui vous manque dans la fenêtre ?
    Sinon, essayez de désactiver les widgets un à un pour voir celui qui provoque le message.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Bonjour,

    C'est mon widget opengl qui cause le trouble =/ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MyPanelOpenGL *gl = new MyPanelOpenGL(spinbox_sides->value(),spinbox_radius->value(),this);

  9. #9
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 477
    Par défaut
    Il me semble que le addWidget du layout se charge déjà de créer un lien de parenté entre les widgets. Du coup pas besoin de respécifier la fenêtre principale comme parent du widget opengl.
    Tu peux tester par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyPanelOpenGL *gl = new MyPanelOpenGL(spinbox_sides->value(),spinbox_radius->value(),0);

Discussions similaires

  1. Fermer toutes les fenêtres filles ayant pour origine une même session
    Par [DreaMs] dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 10/04/2009, 22h01
  2. Réponses: 2
    Dernier message: 05/03/2008, 19h30
  3. [formatage d une variable date vers string dans une jsp]
    Par jayjaypg22 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/12/2007, 17h03
  4. Ouvrir une form fille au chargement d'une MDIParent
    Par nicolas2603 dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/09/2007, 14h45
  5. [Javascript] Fermeture d'une page fille et reactualisation de la page mère
    Par tchoukapi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/07/2006, 19h26

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