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 :
Avez vous une idée du problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part QObject::connect: No such slot Window::transmettre_text() in ...
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 :
J'ai un peu cherché mais je ne vois pas à quoi cela correspond.
Code : Sélectionner tout - Visualiser dans une fenêtre à part create: CreateWindowEx failed (Impossible de créer une fenêtre enfant supérieure.)
Voici mon code :
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 #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
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
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.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 #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
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
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.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 #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
Merci d'avance pour votre temps
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); }
Partager