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

Qwt Discussion :

Problème de vector


Sujet :

Qwt

  1. #1
    Membre habitué
    Homme Profil pro
    automatisme
    Inscrit en
    Octobre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 54
    Points : 152
    Points
    152
    Par défaut Problème de vector
    Bonjour,

    j'essai de tracer des segments de courbes (des courbes discontinues) avec une application Qt et la biblio Qwt.
    Pour faire cela, voulait stocker une courbe (QwtPlotCurve) dans un vector<QwtPlotCurve>.
    J'ai fais une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //jet.h
    #include <qwt_plot_curve.h>
    #include <qwt_plot.h>
    class Jet
    {
    public:
    	std::vector<QwtPlotCurve>&	curveList();
    	void						setCurveList(const QwtPlotCurve& c);
    private:
    	std::vector<QwtPlotCurve>	m_curvelist;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //jet.cpp
    std::vector<QwtPlotCurve>& Jet::curveList()
    {
    	return (m_curvelist);
    }
     
    void		Jet::setCurveList(const QwtPlotCurve &c)
    {
    	m_curvelist.push_back(c);
    }
    Mon accesseur setCurveList fait des siennes. Quand je le mets en commentaire tout compile et le programme se lance. Mais lorsque j'essai de le compiler :
    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
     
    C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include\c++\ext\new_allocator.h:120: erreur : use of deleted function 'QwtPlotCurve::QwtPlotCurve(const QwtPlotCurve&)'
      { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
        ^
     
    C:\Qwt-6.1.3\include\qwt_plot_curve.h:55: erreur : use of deleted function 'QwtPlotSeriesItem::QwtPlotSeriesItem(const QwtPlotSeriesItem&)'
     
    C:\Qwt-6.1.3\include\qwt_plot_item.h:294: erreur : 'QwtPlotItem::QwtPlotItem(const QwtPlotItem&)' is private
         QwtPlotItem( const QwtPlotItem & );
         ^
     
    C:\Qwt-6.1.3\include\qwt_plot_seriesitem.h:22: erreur : within this context
     class QWT_EXPORT QwtPlotSeriesItem: public QwtPlotItem,
                      ^
     
    C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include\c++\bits\stl_construct.h:75: erreur : use of deleted function 'QwtPlotCurve::QwtPlotCurve(const QwtPlotCurve&)'
         { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
           ^
    J'ai le droit à ces 5 erreurs.
    il me semblait pouvoir push_back des éléments de différents tailles dans un vector.

    Si vous voyez ce qui ne tourne pas rond, je suis à votre disposition pour essayer vos propositions/solutions


    Cordialement Victor

  2. #2
    Membre habitué
    Homme Profil pro
    automatisme
    Inscrit en
    Octobre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 54
    Points : 152
    Points
    152
    Par défaut
    C'est bon, après une grosse prise de tête (et pas mal de test), j'ai trouvé une solution. Je déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //.h
    public:
    	QVector<QwtPlotCurve *>		curveList();
    	void				setCurveList(QwtPlotCurve* c);
     
    private:
    	QVector<QwtPlotCurve*>		m_curvelist;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //.cpp
    QVector<QwtPlotCurve*> Jet::curveList()
    {
    	return (m_curvelist);
    }
     
    void		Jet::setCurveList(QwtPlotCurve *c)
    {
    	m_curvelist.push_back(c);
    }
    J'ai essayé avec des QVector, j'ai eu encore plus d'erreur (11)
    j'ai ensuite déclaré un vecteur de pointeur sur QwtPlotCurve et j'envoie un pointeur à l'accesseur.

    Maintenant ça passe mais je ne sais pas dire pourquoi. Qu'est-ce qui ne va pas avec les références?

    Si quelqu'un sait expliquer pourquoi ça marche maintenant et pas avant. Je suis tout ouïe.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Le problème provient du fait que QwtPlotCurve hérite de la classe QwtPlotItem qui interdit la copie par valeur.
    Ceci est dû à l'utilisation de la macro Q_DISABLE_COPY dans le fichier qwt_plot_item.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Q_DISABLE_COPY(QwtPlotItem)
    Le fait d'utiliser une liste de valeurs, et non de pointeurs, entraîne forcément une copie ce qui génère l'erreur de compilation.

    QObject utilise le même principe car on pars du principe que ce n'est pas un objet de "donnée", et qu'il n'est donc pas censé être copié.
    En ce qui concerne QObject, vous trouverez plus de détails à ce sujet en suivant ces deux liens:
    http://doc.qt.io/qt-5/qobject.html#n...nment-operator
    http://doc.qt.io/qt-5/object.html#identity-vs-value

    J'imagine que ce sont plus ou moins pour les mêmes raisons que la copie est interdite avec QwtPlotItem.

    Donc votre solution fonctionne très bien si vous vous assurez de bien supprimer chaque pointeur dans votre liste lorsqu'un objet QwtPlotCurve pointé est détruit.
    Une autre solution pourrait être de ne stocker que les données (poins de la courbe) contenues dans votre liste. Mais d'après ce que j'ai vu (en vitesse) il n'est pas possible de récupérer les données depuis la classe QwtPlotCurve, ce qui me paraît étonnant, mais vous devez mieux connaître cela que moi.

  4. #4
    Membre habitué
    Homme Profil pro
    automatisme
    Inscrit en
    Octobre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 54
    Points : 152
    Points
    152
    Par défaut
    Bonjour,
    merci pour cette explication, c'est exactement les informations que je recherchais. Je comprends mieux pourquoi il faut passer par des pointeurs.

    Victor

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

Discussions similaires

  1. Problème redimensionnement vector
    Par Zacks dans le forum SL & STL
    Réponses: 2
    Dernier message: 19/06/2006, 15h18
  2. [Debutant][Vector]Petit problème de vector
    Par GyZmoO dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/05/2006, 10h39
  3. Problème avec vector par référence
    Par vdumont dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/05/2006, 08h25
  4. Problème de vector
    Par jamesleouf dans le forum SL & STL
    Réponses: 13
    Dernier message: 22/03/2006, 22h36
  5. problème class vector
    Par Pe04 dans le forum SL & STL
    Réponses: 2
    Dernier message: 27/02/2006, 10h45

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