Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Problem with gbinary files, and QVector
Forum Updated to NodeBB v4.3 + New Features

Problem with gbinary files, and QVector

Scheduled Pinned Locked Moved General and Desktop
35 Posts 7 Posters 5.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Loc888

    @mrjj Back to that QFile for one moment, i have to inherit that QDataStream, and overload the operators?

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by jsulm
    #22

    @Loc888 No, you just implement << and >> operators for your own data types.
    See documentation: http://doc.qt.io/qt-5/qdatastream.html#
    You need:

    QDataStream &operator<<(QDataStream &, const YOUR_TYPE &);
    QDataStream &operator>>(QDataStream &, YOUR_TYPE &);
    

    You don't have to do it for Qt types like QVector.

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    L 1 Reply Last reply
    3
    • jsulmJ jsulm

      @Loc888 No, you just implement << and >> operators for your own data types.
      See documentation: http://doc.qt.io/qt-5/qdatastream.html#
      You need:

      QDataStream &operator<<(QDataStream &, const YOUR_TYPE &);
      QDataStream &operator>>(QDataStream &, YOUR_TYPE &);
      

      You don't have to do it for Qt types like QVector.

      L Offline
      L Offline
      Loc888
      wrote on last edited by
      #23

      @jsulm Ok, i took a look, and it says

      "In addition to the overloaded stream operators documented here, any Qt classes that you might want to serialize to a QDataStream will have appropriate stream operators declared as non-member of the class:"

      So i have to do that, outside the class, but how to use it then? If i crate a object, then how to use that overloaded operators?

      mrjjM 1 Reply Last reply
      0
      • L Loc888

        @jsulm Ok, i took a look, and it says

        "In addition to the overloaded stream operators documented here, any Qt classes that you might want to serialize to a QDataStream will have appropriate stream operators declared as non-member of the class:"

        So i have to do that, outside the class, but how to use it then? If i crate a object, then how to use that overloaded operators?

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #24

        @Loc888 said in Problem with gbinary files, and QVector:

        So i have to do that, outside the class, but how to use it then? If i crate a object, then how to use that overloaded operators?

        Hi
        That is the easy part.
        Simply try it and see

        QFile file("file.dat");
        file.open(QIODevice::WriteOnly);
        QDataStream out(&file);
        out << *yourclassptr;
        (note the *)
        if Qt can find an << for a type, it will simply use it.

        That way, you can << anything you like.

        L 1 Reply Last reply
        1
        • mrjjM mrjj

          @Loc888 said in Problem with gbinary files, and QVector:

          So i have to do that, outside the class, but how to use it then? If i crate a object, then how to use that overloaded operators?

          Hi
          That is the easy part.
          Simply try it and see

          QFile file("file.dat");
          file.open(QIODevice::WriteOnly);
          QDataStream out(&file);
          out << *yourclassptr;
          (note the *)
          if Qt can find an << for a type, it will simply use it.

          That way, you can << anything you like.

          L Offline
          L Offline
          Loc888
          wrote on last edited by
          #25

          @mrjj Ok, i try. SO i have to do a class, put there thise operators, and then use:

          out << *new_class ?

          mrjjM 1 Reply Last reply
          0
          • L Loc888

            @mrjj Ok, i try. SO i have to do a class, put there thise operators, and then use:

            out << *new_class ?

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by mrjj
            #26

            @Loc888
            Yes and the reason for the * in from of object pointer is that the header says
            (QDataStream &, const YOUR_TYPE &); << reference

            so if you give it the pointer without *, it
            will save/stream the address of the object as it then matches << for int instead.
            so say always use * when you have a pointer to an object with <<

            1 Reply Last reply
            0
            • mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #27

              Hi
              Just to be sure
              can you show your
              QDataStream &operator<<(QDataStream &, const YOUR_Class &);
              implementation.
              (not the .h declaration) but the actual body of it.

              L 1 Reply Last reply
              0
              • mrjjM mrjj

                Hi
                Just to be sure
                can you show your
                QDataStream &operator<<(QDataStream &, const YOUR_Class &);
                implementation.
                (not the .h declaration) but the actual body of it.

                L Offline
                L Offline
                Loc888
                wrote on last edited by Loc888
                #28

                @mrjj In the QDataStream Class it looks like that, so i guess i am gonna use this template, except i am gonna use a custom data:

                inline QDataStream &QDataStream::operator<<(quint16 i)
                { return *this << qint16(i); }

                1 Reply Last reply
                0
                • mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by mrjj
                  #29

                  Hi
                  Here is small sample.

                  --in the .H file--
                  class MyClass
                  {
                  public:
                      int value = 6;
                      QString name = "test";
                  };
                  
                  QDataStream &operator<<(QDataStream &out, const MyClass &);
                  QDataStream &operator>>(QDataStream &in, MyClass &);
                  
                  -----------
                  --in the .CPP file--
                  QDataStream &operator<<(QDataStream &out, const MyClass &classRef) {
                  return out << classRef.value <<  classRef.name; // save each member of your class
                  }
                  
                  QDataStream &operator>>(QDataStream &in,  MyClass &classRef){
                  return in >> classRef.value >>  classRef.name; // read in IN SAME order
                  }
                  
                  ------------------------------
                  //--test of saving--
                     {
                          QFile file("e:/file.dat");
                          file.open(QIODevice::WriteOnly);
                          QDataStream out(&file);
                          MyClass *ptr = new MyClass;
                          out << *ptr;
                      }
                  //--test of loading--
                      {
                          QFile file("e:/file.dat");
                          file.open(QIODevice::ReadOnly);
                          QDataStream in(&file);
                          MyClass *otherptr = new MyClass;
                          in >> *otherptr;      
                      }
                  
                  
                  L 1 Reply Last reply
                  1
                  • mrjjM mrjj

                    Hi
                    Here is small sample.

                    --in the .H file--
                    class MyClass
                    {
                    public:
                        int value = 6;
                        QString name = "test";
                    };
                    
                    QDataStream &operator<<(QDataStream &out, const MyClass &);
                    QDataStream &operator>>(QDataStream &in, MyClass &);
                    
                    -----------
                    --in the .CPP file--
                    QDataStream &operator<<(QDataStream &out, const MyClass &classRef) {
                    return out << classRef.value <<  classRef.name; // save each member of your class
                    }
                    
                    QDataStream &operator>>(QDataStream &in,  MyClass &classRef){
                    return in >> classRef.value >>  classRef.name; // read in IN SAME order
                    }
                    
                    ------------------------------
                    //--test of saving--
                       {
                            QFile file("e:/file.dat");
                            file.open(QIODevice::WriteOnly);
                            QDataStream out(&file);
                            MyClass *ptr = new MyClass;
                            out << *ptr;
                        }
                    //--test of loading--
                        {
                            QFile file("e:/file.dat");
                            file.open(QIODevice::ReadOnly);
                            QDataStream in(&file);
                            MyClass *otherptr = new MyClass;
                            in >> *otherptr;      
                        }
                    
                    
                    L Offline
                    L Offline
                    Loc888
                    wrote on last edited by
                    #30

                    @mrjj Something weird is happening, i declared those operators in a header file, then include it, and it's working, if i use that MyClass pointer, then i get the error..

                    mrjjM 1 Reply Last reply
                    0
                    • L Loc888

                      @mrjj Something weird is happening, i declared those operators in a header file, then include it, and it's working, if i use that MyClass pointer, then i get the error..

                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #31

                      @Loc888
                      What error?

                      L 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        @Loc888
                        What error?

                        L Offline
                        L Offline
                        Loc888
                        wrote on last edited by
                        #32

                        @mrjj Nope, it's ok... I just typed the wrong object type. It's working finnaly. Thanks
                        everybody for help.

                        mrjjM 1 Reply Last reply
                        1
                        • L Loc888

                          @mrjj Nope, it's ok... I just typed the wrong object type. It's working finnaly. Thanks
                          everybody for help.

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by mrjj
                          #33

                          @Loc888
                          Good work. :)
                          please mark as solved then.

                          L 1 Reply Last reply
                          0
                          • mrjjM mrjj

                            @Loc888
                            Good work. :)
                            please mark as solved then.

                            L Offline
                            L Offline
                            Loc888
                            wrote on last edited by
                            #34

                            @mrjj It's solved, but i don't wanna close it, maybe somebody will need help with that STD stuff, i leave it behind for now, because this motheod is cleaner and faster.

                            jsulmJ 1 Reply Last reply
                            0
                            • L Loc888

                              @mrjj It's solved, but i don't wanna close it, maybe somebody will need help with that STD stuff, i leave it behind for now, because this motheod is cleaner and faster.

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #35

                              @Loc888 Please close. If somebody has a problem/question he/she can open a new thread. Your problem is solved, right?

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved