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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut Plantage de l'application lors manipulations d'un QVector d'une classe par une autre classe de l'application
    Bonjour tout le monde.

    Il se produit quelque chose que je trouve trop bizar avec mon application.

    Parmis les nombreuses classes que comporte l'application, dont une partie sont des classes "GUI" et d'autres sont des classes derivant directement de "QObject", il y en a deux qui me causent un sérieux probleme: La classe "Ecran" et la classe "Traitement"

    La classe "Ecran" est dérivée de "QLabel" avec deux methodes:
    - dessiner_point(QPoint p);
    - effacer_tous_les_points();
    Cette classe a un attribu qui est un QVector<QPoint>

    - dans la méthode "dessiner_point(QPoint p)", il y a seulement un ajout du point "p" au QVector, puis un appel a la méthode "repaint()" de la classe.
    - dans la méthode "effacer_tous_les_points()", il y a un simple appel a la methode "clear()" du QVector, puis un appel a la méthode "repaint()"

    - j'ai surchargé la méhode "mousePressEvent(QMouseEvent*)" de la classe "Ecran" comme suit:
    quand un clique avec le bouton gauche est fait, la méthode "dessiner_point" est appelé avec comme arguments, les coordonnées du point du clique.
    quand un clique avec le bouton droit est fait, la méthode "effacer_tous_les_points" est appelé

    - j'ai aussi surchargé la méhode "paintEvent(QPaintEvent*)" de la classe "Ecran" de sorte que le QVector<Point> soit parcouru et que chaque point contenu soit déssiné sous forme de croix.

    Lors du test de cette implémentation, a chaque clique du bouton gauche, une croix est dessinée a l'endroit du clique, a chaque clique du bouton droit, tous les points sont effacés. Tout marche comme je le voulais.

    Maintenant, le probleme entre en jeu: J'ai une seconde classe "Traitement" qui parmi les choses qu'elle fait, doit dire si lors d'un clique sur l'ecran, une croix doit etre dessinée ou non (en fonction de l'etape du traitement en cours).

    cette classe contien deux méthodes "clique_gauche_sur_ecran(int x, int y)" et "clique_droit_sur_ecran(int x, int y)"

    j'ai modifié la méthode "mousePressEvent" de la classe ecran pour que lors d'un clique sur ecran, il ne soit plus fait appel a "dessinier_point" mais plutot a l'une des deux méthodes cités de la classe "Traitement" (en fonction du bouton préssé lors du clique).

    la méthode (de la classe "Traitement") qui est appelé fais les tests necessaire pour savoir si oui ou non le point doit etre dessiné (ou alors si les points doivent etre effacés en cas d'appel de la deuxieme méthode). si la reponse est oui, alors un appel a la méthode "dessiner_point" (avec un QPoint(x,y) en argument) ou "effacer_tous_les_points" de la classe "Ecran" est fait.

    C'est ici que le plantage a lieu!!!

    Quand j'execute mon code, dés l'appel a la méthode "dessiner_point" ou "effacer_tous_les_points" de la classe "Ecran" par l'instance de la classe "Traitement", l'application se ferme sans raison! j'ai mis des "cout" un peu partout dans mon code pour suivre l'execution, et il s'est averé que l'instruction qui fait planté l'application est celle effectuant une opération sur le QVector!!! que ce soit un "append", un "push_back" ou un "clear", dés que l'execution arrive dessus, l'application se ferme!!

    Trouvez vous normal que quand l'appel aux deux méthodes "dessiner_point" et "effacer_tous_les_points" est fait par une instance de la classe meme, tout marche bien, mais quand c'est une autre classe qui fait appel a ces méthodes, l'application se ferme dés qu'une tentative d'utilisation du QVector est faite?

    Si vous avez explication à ce plantage, je vous en remerci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Bonjour,

    Il n'a rien de normal ou d'anormal, il n'y a que des accès mémoires plus ou moins corrects .

    Nous ne pouvons pas t'aider juste avec ces explications. Il doit forcément y a voir une erreur quelque part, dans ton code ou dans la conception. Il est probable que tu essaies d'utiliser un QVector ou un QPoint qui a déjà été détruit, ou un truc dans le genre.

    Avec un peu de code, on pourra t'aider.

    G.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Bonjour Gulish,

    Voici la partie du code source qui cause problème:

    Ecran.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
     
    #ifndef ECRAN_H_
    #define ECRAN_H_
     
    #include <QLabel>
    #include <QPainter>
    #include <QPen>
    #include <QVector>
    #include <QPoint>
    #include "../traitements/Parametrage.h"
     
    class Ecran : public QLabel{
     
    	Q_OBJECT
     
    	public:
    		Ecran(Parametrage *inst_param);
    		void paintEvent(QPaintEvent *);
    		void mousePressEvent(QMouseEvent*);
    		void dessiner_point(QPoint p);
    		void effacer_tous_Les_Points();
     
    	private:
    		Parametrage		*inst_Parametrage;
    		QVector<QPoint>		liste_points;
    };
     
    #endif /* ECRAN_H_ */
    Ecran.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
     
    #include "Ecran.h"
     
    Ecran::Ecran(Parametrage *inst_param): QLabel(){
    	this->inst_Parametrage=inst_param;
    }
     
    void Ecran::mousePressEvent(QMouseEvent *qme){
    	if(qme->buttons()==Qt::LeftButton){
    		this->dessiner_point(QPoint(qme->x(), qme->y()));
    	}
    	else{
    		this->effacer_tous_Les_Points();
    	}
    }
     
    void Ecran::dessiner_point(QPoint p){
    	this->liste_points.append(p);
    	this->repaint();
    }
     
    void Ecran::effacer_tous_Les_Points(){
    	this->liste_points.clear();
    	this->repaint();
    }
     
    void Ecran::paintEvent(QPaintEvent *qpe){
    	QLabel::paintEvent(qpe);
     
            if(this->liste_points.isEmpty())
    		return;
     
    	QPainter paint(this);
    	QPen s_rouge(QColor(255, 0, 0),1);
    	paint.setPen(s_rouge);
     
    	for(int i=0; i<this->liste_points.size(); i++){
    		QPoint p=this->liste_points.at(i);
    	        paint.drawEllipse(p.x()-6, p.y()-6, 12, 12);
    		paint.drawLine(p.x()-4, p.y()-4, p.x()+4, p.y()+4);
    		paint.drawLine(p.x()-4, p.y()+4, p.x()+4, p.y()-4);
            }
    }
    Jusqu'ici, quand je lance le test, tout se passe bien. A chaque fois que je clique quelque part sur "l'ecran", un cercle et une croix centrés sur le point du clique sont dessinés.

    Maintenant, voila la classe Parametrage:
    Parametrage.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
     
    #ifndef PARAMETRAGE_H_
    #define PARAMETRAGE_H_
     
    #include <QObject>
    #include <QPoint>
     
    class Ecran;
     
    class Parametrage: public QObject{
     
    	Q_OBJECT
     
    	public:
    		Parametrage();
    		void clique_gauche_sur_ecran(QPoint p);
    		void clique_droit_sur_ecran();
     
    	private:
    		Ecran      *ecran;
    };
     
    #endif /* PARAMETRAGE_H_ */
    Parametrage.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
     
    #include "Parametrage.h"
    #include "../gui/Vue_PTZ.h"
     
    Parametrage::Parametrage(): QObject(){
    	this->ecran=new Ecran(this);
    }
     
    void Parametrage::clique_gauche_sur_ecran(QPoint p){
    	this->ecran->dessiner_point(p);
    }
     
    void Parametrage::clique_droit_sur_ecran(){
    	this->ecran->effacer_tous_Les_Points();
    }
    Ensuite, j'ai modifié la classe "Ecran" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void Ecran::mousePressEvent(QMouseEvent *qme){
    	if(qme->buttons()==Qt::LeftButton){
    		this->ins_Parametrage->clique_gauche_sur_ecran(QPoint(qme->x(), qme->y()));
    	}
    	else{
    		this->ins_Parametrage->clique_droit_sur_ecran();
    	}
    }
    Mais cette fois, dés que je clique quelque part sur "l'ecran", l'application se ferme!!!
    J'ai donc ajouté ce qu'il faut pour pouvoir imprimer sur la sortie standard pour suivre l'execution. voila ce que j'ai mis de plus par la suite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Ecran::dessiner_point(QPoint p){
    	cout << "Clique sur le point: " << p.x() << ";" << p.y() << endl;
            this->liste_points.append(p);
            cout << "Le point a été ajouté a la liste" << endl;
    	this->repaint();
    }
     
    void Ecran::effacer_tous_Les_Points(){
    	cout << "Tous les points VONT etre effacés " << endl;
    	this->liste_points.clear();
    	cout << "Tous les points ONT ETE effacés " << endl;
    	this->repaint();
    }
    quand je clique avec le bouton gauche de la souri sur un point de coordonnées (x, y), j'ai seulement le premier message:
    "Clique sur le point: x ; y"
    puis fermeture prématurée de l'application

    et quand je clique avec le bouton de droit de la souri quelque part, j'ai juste le premier message:
    "Tous les points VONT etre effacés"
    puis fermerure prématurée de l'application!

    J'espere qu'avec ces bouts de codes et ces explications, vous y voyez plus claire sur mon probleme. J'attend toutes suggestions ou explications me permettant de regler ce probleme.

    Merci

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Hmm, en fait, quand tu dis que ton programme plante, as tu un message d'erreur ? Si non, a mon avis c'est juste que ton application arrive à son terme et se ferme. Dans ton code, je vois :
    Parametrage:arametrage(): QObject(){
    this->ecran=new Ecran(this);
    }
    Hors il n' y a de show() nul part. Par defaut, ton application se ferme lorsque la dernière fenêtre est fermée. Donc a mon avis c'est simplement l'appel à show() qui est fait au mauvais endroit.

    Sinon, il faut bidouiller ce flag
    quitOnLastWindowClosed : bool

    This property holds whether the application implicitly quits when the last window is closed.

    The default is true.

    If this property is true, the applications quits when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed. By default this attribute is set for all widgets except for sub-windows. Refer to Qt::WindowType for a detailed list of Qt::Window objects.

    Access functions:

    bool quitOnLastWindowClosed ()
    void setQuitOnLastWindowClosed ( bool quit )
    See also quit() and QWidget::close().
    G.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Bonjour Gulish,

    En fait, je n'ai aucun message d'erreur, mais cela n'est pas forcement synonyme d'absence d'erreur. Je travailles sur Eclipse avec CDT, et meme quand j'ai des erreurs que je fais deliberement, comme appeler une méthode d'un objet que je n'aurai pas encore instancié (donc NULL), mes applications se ferments lors de l'appel de cette méthode sans pour autant qu'un message me soit affiché.

    Pour ce qui est du show(), je ne pense pas que ce soit le probleme. En fait, mon projet comporte une trentaine de classes, mais par souci de visibilité du post, je n'ai mis que le code des deux classes qui causent probleme, et le show() fait bien son travail. j'ai une classe dérivant de QMainWindow qui est créée et affichée, et dans laquelle, l'ecran est posé. (le pointeur vers l'ecran est renvoyé par l'instante de Parametrage vers celle du QMainWindow)

    En fait, si tu regarde bien, les seules changements qu'il y a eu entre les deux tests ne devrait nullement influer sur le "show()" vu qu'au 1er test, un appel direct de la méthode "dessiner_point()" est fait lors d'un clique souri, et que dans le 2eme test, c'est un appel vers une méthode d'une autre classe, qui elle meme fait appel a la methode "dessiner_point()" de la premiere classe, qui est fait lors d'un clique.

    Le probleme a mon avis se situe lorsqu'une tentative d'opération est faite sur le QVector<QPoint> de la classe Ecran! les affichage avec "cout<<" le montrent bien! le plantage de l'appli se fait au moment ou une opération sur le QVector est faite! ce qui n'est pas normal vu que dans le 1er test, ça marche bien!

    J'ai essayé toutes les operations possibles sur un QVector a la place du "append", meme is ça n'avait pas de sens! (clear(), push_back(), ....), mais a chaque fois, lorsque l'execution arrive la, l'appli se ferme! mais si a cet endroit, je met l'instruction qui utilise le QVector en commentaire, (c'est a dire, qu'il n'y a que le repaint() qui reste), l'appli continu de fonctionner! est ce que le QVector devient NULL tout seul?

    Des idées sur cette bizarerie?

    Merci

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    En fait, je n'ai aucun message d'erreur, mais cela n'est pas forcement synonyme d'absence d'erreur. Je travailles sur Eclipse avec CDT, et meme quand j'ai des erreurs que je fais deliberement, comme appeler une méthode d'un objet que je n'aurai pas encore instancié (donc NULL), mes applications se ferments lors de l'appel de cette méthode sans pour autant qu'un message me soit affiché.
    Très pratique ... Il existe des outils plus efficaces.

    Sinon, comme je ne voyais pas le problème vu ton code, j'ai décidé d'essayer chez moi. Et en effet, il n'y a pas d'erreurs, tout marche bien. Voici le code exact que j'ai utilisé (quasiment identique au tiens). Merci de le tester sans le reste de l'appli pour voir si le problème ne vient pas d'ailleurs.

    Ecran.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
     
    #ifndef ECRAN_H_
    #define ECRAN_H_
     
    #include <QtCore>
    #include <QtGui>
     
    #include "Parametrage.h"
     
    class Ecran : public QLabel{
     
    	Q_OBJECT
     
    public:
    		Ecran();
    		Ecran(Parametrage *inst_param);
     
     
     
    		void paintEvent(QPaintEvent *);
    		void mousePressEvent(QMouseEvent*);
    		void dessiner_point(QPoint p);
    		void effacer_tous_Les_Points();
     
    	private:
    		Parametrage* inst_Parametrage;
    		QVector<QPoint>		liste_points;
    };
     
    #endif /* ECRAN_H_ */
    Ecran.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 "Ecran.h"
    #include <iostream>
     
    Ecran::Ecran(Parametrage *inst_param): QLabel(){
    	this->inst_Parametrage=inst_param;
    }
     
    void Ecran::mousePressEvent(QMouseEvent *qme){
    	if(qme->buttons()==Qt::LeftButton){
    		this->inst_Parametrage->clique_gauche_sur_ecran(QPoint(qme->x(), qme->y()));
    	}
    	else{
    		this->inst_Parametrage->clique_droit_sur_ecran();
    	}
    }
     
    void Ecran::dessiner_point(QPoint p){
    	std::cout << "Clique sur le point: " << p.x() << ";" << p.y() << endl;
            this->liste_points.append(p);
    		std::cout << "Le point a été ajouté a la liste" << endl;
    	this->repaint();
    }
     
    void Ecran::effacer_tous_Les_Points(){
    	std::cout << "Tous les points VONT etre effacés " << endl;
    	this->liste_points.clear();
    	std::cout << "Tous les points ONT ETE effacés " << endl;
    	this->repaint();
    }
     
    void Ecran::paintEvent(QPaintEvent *qpe){
    	QLabel::paintEvent(qpe);
     
            if(this->liste_points.isEmpty())
    		return;
     
    	QPainter paint(this);
    	QPen s_rouge(QColor(255, 0, 0),1);
    	paint.setPen(s_rouge);
     
    	for(int i=0; i<this->liste_points.size(); i++){
    		QPoint p=this->liste_points.at(i);
    	        paint.drawEllipse(p.x()-6, p.y()-6, 12, 12);
    		paint.drawLine(p.x()-4, p.y()-4, p.x()+4, p.y()+4);
    		paint.drawLine(p.x()-4, p.y()+4, p.x()+4, p.y()-4);
            }
    }
    Parametrage.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
    #ifndef PARAMETRAGE_H_
    #define PARAMETRAGE_H_
     
    #include <QObject>
    #include <QPoint>
     
    class Ecran;
     
    class Parametrage: public QObject{
     
    	Q_OBJECT
     
    	public:
    		Parametrage();
    		void clique_gauche_sur_ecran(QPoint p);
    		void clique_droit_sur_ecran();
     
    	private:
    		Ecran* ec;
    };
     
    #endif /* PARAMETRAGE_H_ */
    Parametrage.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
     
    #include "Parametrage.h"
    #include "Ecran.h"
     
    Parametrage::Parametrage(): QObject(){
    	this->ec=new Ecran(this);
    	ec->show();
    }
     
    void Parametrage::clique_gauche_sur_ecran(QPoint p){
    	this->ec->dessiner_point(p);
    }
     
    void Parametrage::clique_droit_sur_ecran(){
    	this->ec->effacer_tous_Les_Points();
    }
    main.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
    #include <QApplication>
    #include <QtGui>
     
     #include "Ecran.h"
    #include "Parametrage.h"
     
     int main(int argc, char *argv[])
     {
        QApplication app(argc, argv);
     
       Parametrage para;
     
         return app.exec();
     }
    Si ce code là ne fonctionne pas, alors tu dois utiliser une mauvaise version de Qt, ou alors c'est un problème avec gcc, ou il y a une différence de systèmes entre nos deux machines (j'utilise Xp pro 32 bits et Visual C++ (express 2009)).

    En esperant avoir fait avancé le shmilblick !

    G.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Bonjour Gulish,

    Merci pour ta reponse et le code que tu as proposé. J'ai créé un nouveau projet dans lequel j'ai mis le code, et effectivement, ça marche bien. Ce qui m'a mis sur la voie pour résoudre mon probleme.

    En fait, le code que j'avais posté plus haut n'est pas tout a fait celui que j'ai sur mon application qui plante. En réalité, et comme je l'ai dit, il y a une trentaine de classes dans mon projets, réparties entre classes de gui, classes de traitements, etc...

    Les deux classes dont j'ai mis le code n'etaient pas tout à fait comme ça sur mon code, j'ai un peu triché pour simplifié, mais je ne pensais pas que le probleme pouvais venir de la.

    La vrai structure de mon projets (du mois, celle relative à l'execution que je cherchais) est la suivante:

    Un classe Parametrage qui a dans ses attributs, une instance d'une classe "Fenetre" (qui derive de QMainWindow). cette instance "Fenetre" contient parmis ses attributs, une instance d'une classe "Conteneur_Ecrans" qui est un QWidget, qui peut contenir plusieurs ecrans, donc parmis ses attributs, il y a un "Ecran" que j'ai cité.

    Chaque constructeur de ces classes (Fenetre, ConteneurEcrans, et Ecran) contien une instance de Parametrage, qui est indiqué par chaque instance vers celle qu'elle contient (c'est a dire: quand Parametrage instencie "Fenetre", il indique "this" dedans. quand Fenetre instencie ConteneurEcran, il indique l'instance de Parametrage avec laquelle il a été constuit, et ainsi de suite, jusqu'a Ecran qui recupere aussi un pointeur vers le "Parametrage" lancé par l'application).

    Dans le constructeur de Parametrage, in y a une instanciation de Fenetre. Dans le constructeur de Fenetre, il y a une instanciation de Conteneur_Ecrans, et dans le constructeur de Conteneur_Ecran, il y a une instanciation de Ecran.

    Lors du clique sur l'ecran, ça se passe comme dans mon code, c'est à dire que "Ecran" appelle la méthode "clique_gauche...." de son attribu Parametrage. Par contre, dans la méthode "clique_gauche..." de parametrage, ce n'est pas un "this->ecran->dessiner_point()" qui est appelé, mais plutot un "this->fenetre->get_instance_conteneur_ecrans()->get_instance_ecran()->dessiner_point()"

    Ces méthodes "get_instance..." sont implémenté de façon simple, elles retournent un pointeur vers l'objet demandé! puisqu'il fait partie de leurs attributs!
    Donc en testant ça, ça ne marchais pas!

    Mais quand j'ai essayé le code que j'ai modifié pour l'afficher (je l'ai modifié ici, sur le forum et non sur mon IDE, donc je ne l'avais pas testé modifié!), ainsi que ton code, tout marchais bien!

    J'ai donc repris mon projet, et j'ai un peu modifié l'implémentation de sorte que l'instance de Ecran ne soit pas créé par "Conteneur_Ecran" mais plutot par "Parametrage" et est envoyé en parametre du constructeur de fenetre qui l'envois aussi dans le constructeur de "Conteneur_Ecran" qui ne fait que la placer et non l'instanier! et la, dans la méthode "clique_gauche..." de "Parametrage", quand je fais un appel a "this->ecran->dessiner_point()" (car ecran est devenu un attribu de Parametrage maintenant), tout marche très bien! pas de plantage!!

    En gros, le probleme est reglé dans le sens que mon appli peut fonctionner comme je veux, mais ça n'enleve pas ma curiosité sur ce probleme!

    Pourquoi quand je faisais un appel "this->fenetre->get_instance_conteuner_ecran()->get_instance_ecran()->dessiner_point()", toute tentative de modification sur le QVector de "Ecran" faisait planter l'appli? alors que les retour de toutes les methodes "get_instance_..." retournais bien l'objet voulu! (vérifié avec des tests sur NULL et auters attributs!!) ??

    Encore merci Gulish car je peux avancer dans mon travail, mais si quelqu'un peut quand meme expliqué cette anomalie, je suis preneur.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Pourquoi quand je faisais un appel "this->fenetre->get_instance_conteuner_ecran()->get_instance_ecran()->dessiner_point()", toute tentative de modification sur le QVector de "Ecran" faisait planter l'appli? alors que les retour de toutes les methodes "get_instance_..." retournais bien l'objet voulu! (vérifié avec des tests sur NULL et auters attributs!!) ??
    Puisque nous sommes dans le forum Qt, je voulais te rappeler qu'il existe le système de signal/slot qui permet de faire communiquer facilement 2 entités de ton projet, sans avoir à garder/transférer de références de tous tes objets dans toutes tes classes.

    Sinon, je ne veux pas tout chambouler, mais quel est le but de ton application ? Parce qu'utiliser des QLabels pour dessiner différents objets, c'est loin d'être le plus adapté.

    Bonne chance pour la suite,

    G.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Mon application est desitinée à piloter une caméra IP PTZ selon certains criteres, pour effectuer certaines taches précises.

    Donc, l'objet "Ecan" qui derive de QLabel et dans lequel, je dessine ces cercles, en réalité, affiche les images acquises d'une caméra IP en temps réel, comme une vidéo. j'ai un QThread qui se charche d'acquerir et de decoder le flux envoyé par une de mes caméras, en images fixes qu'il fait ensuite affiché par l'"Ecran" en continu (selon un framerate que je spécifie), et l'Ecran affiche l'image reçu.
    Ceci n'est absolument pas un probleme, tout marche très bien. en fait, chaque image que mon QThread segmente à partir du flux est envoyé a "l'Ecran" via le mecanisme des signaux/slots.

    L'affichage des points cliqués est une opération de parametrage pour une tache précise. Ces points ne doivent pas etre dessiné a n'importe quel moment ou l'utilisateur clique. Il y a un certain nombre d'étapes dans le parametrage, et dans certaines, les points ne doivent pas etre dessiné alors que pour d'autres etapes, le dessin des points est obligatoire. donc, c'est l'instance Parametrage qui s'occupe de gerer les etapes en cours et tout le reste (je n'ai pas affiché le code relatif a ça pour alleger mon precedent post, et de toute façon, la seule interaction entre "Parametrage" et "Ecran" a été mise dans le code que j'ai posté).

    J'ai effectivement pensé à utiliser les signaux pour effectuer cette tache, mais je me suis quand meme lancé sur la méthode classique, qui n'est pas propre à Qt: appel de méthodes d'une instance d'une autre classes en utilisant un pointeur vers cette instance! ça marchait a chaque fois que je le faisait, et ça marche meme pour d'autres fonctionnalité de mon projet en cours, mais pas pour cette histoire de QVector!!.

    Maintenant, le probleme est reglé pour ce qui est de l'execution attendu, et je peux aussi refaire la partie concernée en utilisant les signaux/slots. Mais ma question demeure toujours sans reponse! pourquoi ça plantais au départ alors que tout était bon!

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

Discussions similaires

  1. [FAQ] Comment remplacer une image par une autre lors du passage de la souris ?
    Par Invité dans le forum Contributions JavaScript / AJAX
    Réponses: 2
    Dernier message: 03/03/2013, 22h48
  2. Réponses: 6
    Dernier message: 17/01/2012, 16h57
  3. Plantage d'application lors de l'envoi de paquets UDP
    Par Poupine dans le forum Android
    Réponses: 2
    Dernier message: 18/11/2010, 23h11
  4. Réponses: 1
    Dernier message: 14/04/2008, 11h28
  5. Error in the application, lors du Rendu
    Par MatP dans le forum DirectX
    Réponses: 1
    Dernier message: 26/01/2005, 17h02

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