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 :

QByteArray

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Par défaut QByteArray
    Bonsoir,

    J'ai un probleme avec un QByteArray, voici le message d'erreur lors de la compilation:

    "erreur : 'QByteArray::operator QNoImplicitBoolCast() const' is private"

    Et voici mon code :

    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
     
    #include "packetfactory.h"
     
    PacketFactory::PacketFactory()
    {
    }
     
    const QByteArray PacketFactory::factorize(Packet packet)
    {
        QByteArray lowdata;
     
        QDataStream out(&lowdata, QIODevice::WriteOnly);
     
        lowdata << packet.size();
     
        out << packet.id();
     
        lowdata.append(packet.data());
     
        return lowdata;
    }
    Ca coince à la ligne 14, la fonction renvoi un quint32, est-ce lié ?

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    QByteArray est une classe conteneur, pas une classe de lecture/écriture, donc tu n'as pas d'opérateur << du tout. C'est bien QDataStream pour écrire dans le QByteArray, pourquoi tu l'utilises pour écrire packet.id() et pas pour packet.size() ?
    Utilise QDataStream pour toutes les écritures

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Par défaut
    Alors oui j'ai corrigé le pas, en fait j'ai récupérer le code sur un forum, voici le code original

    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
     
    void send(quint8 id, const QByteArray &data) {
     
        QByteArray lowData;
        QDataStream stream(&lowData, QioDevice::WriteOnly);
     
        // Ecriture de la taille (quint8 id + data)
        lowData << (quint32)(sizeof(quint8)+data.size());
     
        // Ecriture de l'id
        stream << id;
     
        // Ecriture de data
        lowData.append(data);
     
        // Envoie
        m_socket.send(lowData);
     
    }
    l'equation avec le cast quint32, c'est bien pour "allouer" l'espace dans le QByteArray ?

    Sinon autre probleme, "'QObject& QObject::operator=(const QObject&)' is private", dans le code suivant :

    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
     
    #ifndef SOCKETMANAGER_H
    #define SOCKETMANAGER_H
     
    #include <QObject>
    #include <QtNetwork>
     
    #include <packetfactory.h>
    #include <packet.h>
     
    class SocketManager : public QObject
    {
        Q_OBJECT
     
    public:
        explicit SocketManager();
        ~SocketManager();
        void send(const Packet packet);
        const QString  stringError() const;
     
    protected:
        QTcpSocket *m_socket;
        QString m_error;
     
    signals:
        void error();
     
    public slots:
        void receiveData();
        void connected();
        void disconnected();
        void error(QAbstractSocket::SocketError error);
     
    };
     
    #endif // SOCKETMANAGER_H
    La je ne vois pas vraiment le probleme, j'ai mis la macro, qu'est-ce qui cloche ?

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    l'equation avec le cast quint32, c'est bien pour "allouer" l'espace dans le QByteArray ?
    On dit pas "équation"
    Sinon, non. Pour changer la taille, c'est la fonction resize
    Par contre, un moment donné, il faut quand même lire la documentation http://doc-snapshot.qt-project.org/q...ay.html#resize

    Et ce code n'est pas valide, il n'y a pas d'opérateur << dans QByteArray !

    Sinon autre probleme, "'QObject& QObject::operator=(const QObject&)' is private", dans le code suivant :
    Alors, c'est un autre problème a priori, donc règle les problème un par un.
    Et non, cette erreur ne correspond pas à ce code. Une erreur est toujours lié à une ligne en particulier. Faut donner la ligne correspondante

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Par défaut
    Alors oui j'ai bien modifier mon code pour utiliser un resize, mais ne t’inquiète pas je lis souvent la doc ^^. Je voulais simplement être sur de pas avoir fait fausse route.

    Concernant le deuxième problème, il fallait que j'instancie la classe avec un pointeur et hop problème réglé, mais je vois toujours pas le comment du pourquoi ?

    En tout cas merci de ton aide .

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Par ce que les classes dérivées de QObject respectent la sémantique d'entité et ne sont donc pas copiables. Voir FAQ - Quand est-ce qu'une classe a une sémantique de d'entité ? Donc il faut manipuler des pointeurs au lieu des objets directement.

    Un conseil, pour les pointeurs, utilise les pointeurs intelligents QScopedPointer ou QSharedPointer (si tu sais pas qui doit avoir la responsabilité, utilise QSharedPointer)

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

Discussions similaires

  1. Petit problème QString et QByteArray
    Par tiagocerqueira dans le forum Qt
    Réponses: 0
    Dernier message: 02/02/2010, 18h07
  2. Conversion Hexa et QByteArray
    Par sardik dans le forum Qt
    Réponses: 6
    Dernier message: 19/05/2009, 10h48
  3. Transformer un QByteArray en QString
    Par Lynix dans le forum Qt
    Réponses: 11
    Dernier message: 08/04/2009, 22h06
  4. Réponses: 21
    Dernier message: 14/11/2008, 12h02
  5. Réponses: 6
    Dernier message: 07/03/2007, 14h59

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