Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'"
Forum Updated to NodeBB v4.3 + New Features

error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'"

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
26 Posts 7 Posters 9.4k 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.
  • JonBJ JonB

    @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

    this->title() = "Hello World";
    this->singer() = "Dac Luc";
    this->source() = "lll";
    this->album_art() = "qrc:/Image/Hongkong1.png";
    

    Nope! Those are getter functions, hence the error message! You need to write setters too, as Qt does for all properties like these, to be called like:

        this->setTitle("Hello World");
    
    Lucas_1603L Offline
    Lucas_1603L Offline
    Lucas_1603
    wrote on last edited by
    #5

    @jonb
    After added those setter functions and now my .cpp became like:

    #include <song.h>
    Song::Song(QObject *parent) : QObject (parent)
    {
        this->setTitle("Hello world");
        this->setSinger("Dac Luc");
        this->setSource("lll");
        this->setAlbumArt("qrc:/Image/Hongkong1.png");
    }
    Song::Song(const QString &title, const QString &singer, const QString &source,  const QString &albumArt)
    {
        m_title = title;
        m_singer = singer;
        m_source = source;
        m_albumArt = albumArt;
    }
    
    Q_INVOKABLE QString Song::title() const
    {
        return m_title;
    }
    
    QString Song::singer() const
    {
        return m_singer;
    }
    
    QString Song::source() const
    {
        return m_source;
    }
    
    QString Song::album_art() const
    {
        return m_albumArt;
    }
    

    But the errors are still the same

    jsulmJ 1 Reply Last reply
    0
    • Lucas_1603L Lucas_1603

      @jonb
      After added those setter functions and now my .cpp became like:

      #include <song.h>
      Song::Song(QObject *parent) : QObject (parent)
      {
          this->setTitle("Hello world");
          this->setSinger("Dac Luc");
          this->setSource("lll");
          this->setAlbumArt("qrc:/Image/Hongkong1.png");
      }
      Song::Song(const QString &title, const QString &singer, const QString &source,  const QString &albumArt)
      {
          m_title = title;
          m_singer = singer;
          m_source = source;
          m_albumArt = albumArt;
      }
      
      Q_INVOKABLE QString Song::title() const
      {
          return m_title;
      }
      
      QString Song::singer() const
      {
          return m_singer;
      }
      
      QString Song::source() const
      {
          return m_source;
      }
      
      QString Song::album_art() const
      {
          return m_albumArt;
      }
      

      But the errors are still the same

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

      @lucas_1603 Where exactly do you get the error?
      The problem: QObject instances are NOT copyable.

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

      Lucas_1603L 1 Reply Last reply
      1
      • jsulmJ jsulm

        @lucas_1603 Where exactly do you get the error?
        The problem: QObject instances are NOT copyable.

        Lucas_1603L Offline
        Lucas_1603L Offline
        Lucas_1603
        wrote on last edited by Lucas_1603
        #7

        @jsulm I think I'm getting trouble with Song class but actually I'm not sure about that because my project has other classes too. But I just see the errors in Song class now

        0_1568630374154_5f945232-7a62-4a16-8251-6caa978974c4-image.png

        JonBJ jsulmJ 2 Replies Last reply
        0
        • Lucas_1603L Lucas_1603

          @jsulm I think I'm getting trouble with Song class but actually I'm not sure about that because my project has other classes too. But I just see the errors in Song class now

          0_1568630374154_5f945232-7a62-4a16-8251-6caa978974c4-image.png

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by JonB
          #8

          @lucas_1603
          I'm not an expert C++-er, but:

          • Did you re-run qmake after adding the Q_OBJECT macro to the file?

          • Song::Song(const QString &title, const QString &singer, const QString &source, const QString &albumArt)
            Does this constructor not need to invoke : QObject (parent) or your : Song(parent)? (I'm not sure about this one, but I'm thinking you need something like this?)

          Lucas_1603L 1 Reply Last reply
          2
          • JonBJ JonB

            @lucas_1603
            I'm not an expert C++-er, but:

            • Did you re-run qmake after adding the Q_OBJECT macro to the file?

            • Song::Song(const QString &title, const QString &singer, const QString &source, const QString &albumArt)
              Does this constructor not need to invoke : QObject (parent) or your : Song(parent)? (I'm not sure about this one, but I'm thinking you need something like this?)

            Lucas_1603L Offline
            Lucas_1603L Offline
            Lucas_1603
            wrote on last edited by
            #9

            @jonb Thanks a lot, I'll try to find it out

            1 Reply Last reply
            0
            • Lucas_1603L Lucas_1603

              @jsulm I think I'm getting trouble with Song class but actually I'm not sure about that because my project has other classes too. But I just see the errors in Song class now

              0_1568630374154_5f945232-7a62-4a16-8251-6caa978974c4-image.png

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

              @lucas_1603 Your Song class is QObject based and thus not copyable. You're apparently trying to make a copy of it.
              Double click at the first error line and see what is there.

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

              Lucas_1603L 1 Reply Last reply
              2
              • jsulmJ jsulm

                @lucas_1603 Your Song class is QObject based and thus not copyable. You're apparently trying to make a copy of it.
                Double click at the first error line and see what is there.

                Lucas_1603L Offline
                Lucas_1603L Offline
                Lucas_1603
                wrote on last edited by
                #11

                @jsulm I don't know what you mean by said that I'm trying to make a copy of it. I actually didn't assign any ones to others!

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #12

                  Hi,

                  Are you maybe using the copy constructor somewhere ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  Lucas_1603L 1 Reply Last reply
                  0
                  • SGaistS SGaist

                    Hi,

                    Are you maybe using the copy constructor somewhere ?

                    Lucas_1603L Offline
                    Lucas_1603L Offline
                    Lucas_1603
                    wrote on last edited by Lucas_1603
                    #13

                    @sgaist Nope, I don't use it in my project and I'm quite sure about that ^^.
                    I really want to know what does the error use of deleted function 'Song::Song(const Song&)' mean.

                    JKSHJ 1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #14

                      It means that somewhere in your code you are using the copy constructor which is disabled since QObject objects cannot be copied.

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      1
                      • Lucas_1603L Lucas_1603

                        @sgaist Nope, I don't use it in my project and I'm quite sure about that ^^.
                        I really want to know what does the error use of deleted function 'Song::Song(const Song&)' mean.

                        JKSHJ Offline
                        JKSHJ Offline
                        JKSH
                        Moderators
                        wrote on last edited by JKSH
                        #15

                        @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

                        Nope, I don't use it in my project and I'm quite sure about that ^^.

                        The copy constructor is invoked when you try to assign one Song object to another, for example:

                        Song s1("Happy Birthday to You", "Me", "/path/to/song", "/path/to/art");
                        
                        Song s2(s1);  // copy-constructor invoked here
                        Song s3 = s1; // operator=() and copy-constructor invoked here
                        

                        I really want to know what does the error use of deleted function 'Song::Song(const Song&)' mean.

                        It means your code contains something like s2 or s3 above.

                        • Song::Song(const Song&) is the copy-constructor
                        • A "deleted function" is a function which the creator has removed/deleted from the class -- QObjects are not allowed to have copy-constructors. See https://thispointer.com/c11-c14-delete-keyword-and-deleted-functions-with-use-cases-examples/ for more info

                        Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                        Lucas_1603L 1 Reply Last reply
                        4
                        • JKSHJ JKSH

                          @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

                          Nope, I don't use it in my project and I'm quite sure about that ^^.

                          The copy constructor is invoked when you try to assign one Song object to another, for example:

                          Song s1("Happy Birthday to You", "Me", "/path/to/song", "/path/to/art");
                          
                          Song s2(s1);  // copy-constructor invoked here
                          Song s3 = s1; // operator=() and copy-constructor invoked here
                          

                          I really want to know what does the error use of deleted function 'Song::Song(const Song&)' mean.

                          It means your code contains something like s2 or s3 above.

                          • Song::Song(const Song&) is the copy-constructor
                          • A "deleted function" is a function which the creator has removed/deleted from the class -- QObjects are not allowed to have copy-constructors. See https://thispointer.com/c11-c14-delete-keyword-and-deleted-functions-with-use-cases-examples/ for more info
                          Lucas_1603L Offline
                          Lucas_1603L Offline
                          Lucas_1603
                          wrote on last edited by
                          #16

                          @jksh Yep, I got it. I realized what all you guys said.

                          So I change the approach to my project now, assume that I have a PlaylistModel class:

                          #include <QAbstractListModel>
                          class PlaylistModel : public QAbstractListModel
                          {
                              Q_OBJECT
                          
                          public:
                              enum Roles {
                                  TitleRole = Qt::UserRole + 1,
                                  SingerRole,
                                  SourceRole,
                                  AlbumArtRole
                              };
                          
                              explicit PlaylistModel(QObject *parent = nullptr);
                          
                              int rowCount(const QModelIndex &parent = QModelIndex()) const override;
                          
                              QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
                              void addSong(Song &song);
                          
                          protected:
                              QHash<int, QByteArray> roleNames() const override;
                          
                          private:
                              QList<Song> m_data;
                          };
                          

                          Now I want to access m_data (is the private attribute) from QML file, how can I do that?

                          Thanks a lot for your help.

                          JonBJ 1 Reply Last reply
                          0
                          • Lucas_1603L Lucas_1603

                            @jksh Yep, I got it. I realized what all you guys said.

                            So I change the approach to my project now, assume that I have a PlaylistModel class:

                            #include <QAbstractListModel>
                            class PlaylistModel : public QAbstractListModel
                            {
                                Q_OBJECT
                            
                            public:
                                enum Roles {
                                    TitleRole = Qt::UserRole + 1,
                                    SingerRole,
                                    SourceRole,
                                    AlbumArtRole
                                };
                            
                                explicit PlaylistModel(QObject *parent = nullptr);
                            
                                int rowCount(const QModelIndex &parent = QModelIndex()) const override;
                            
                                QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
                                void addSong(Song &song);
                            
                            protected:
                                QHash<int, QByteArray> roleNames() const override;
                            
                            private:
                                QList<Song> m_data;
                            };
                            

                            Now I want to access m_data (is the private attribute) from QML file, how can I do that?

                            Thanks a lot for your help.

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #17

                            @lucas_1603
                            You can only access private variables in the class which defines them. So expose a getter/setter if you really need to. But since QAbstractListModel already has data() & setData() methods you would normally go via those.

                            1 Reply Last reply
                            2
                            • JKSHJ Offline
                              JKSHJ Offline
                              JKSH
                              Moderators
                              wrote on last edited by
                              #18

                              @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

                              QList<Song> m_data

                              Does that compile?

                              Store pointers-to-QObjects inside containers, rather than QObjects themselves.

                              Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                              Lucas_1603L 1 Reply Last reply
                              3
                              • JKSHJ JKSH

                                @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

                                QList<Song> m_data

                                Does that compile?

                                Store pointers-to-QObjects inside containers, rather than QObjects themselves.

                                Lucas_1603L Offline
                                Lucas_1603L Offline
                                Lucas_1603
                                wrote on last edited by
                                #19

                                @jksh Yes, it compiled.
                                @JonB As you said, I can access m_data via data() and setData() method. In data(), I have to assign QModelIndex &index and int role to it .
                                How I can use data() method with enum TitleRole?

                                JKSHJ 1 Reply Last reply
                                0
                                • IntruderExcluderI Offline
                                  IntruderExcluderI Offline
                                  IntruderExcluder
                                  wrote on last edited by
                                  #20

                                  You should override roleNames method in your model:

                                  QHash<int, QByteArray> PlaylistModel::roleNames() const
                                  {
                                      static QHash<int, QByteArray>* ret = nullptr;
                                      if (ret)
                                          return *ret;
                                  
                                      ret = new QHash<int, QByteArray>();
                                      (*ret)[TitleRole] = "title";
                                      ...
                                  
                                      return *ret;
                                  }
                                  

                                  Then in QML you can use them as model property: model.title.

                                  Lucas_1603L 1 Reply Last reply
                                  0
                                  • IntruderExcluderI IntruderExcluder

                                    You should override roleNames method in your model:

                                    QHash<int, QByteArray> PlaylistModel::roleNames() const
                                    {
                                        static QHash<int, QByteArray>* ret = nullptr;
                                        if (ret)
                                            return *ret;
                                    
                                        ret = new QHash<int, QByteArray>();
                                        (*ret)[TitleRole] = "title";
                                        ...
                                    
                                        return *ret;
                                    }
                                    

                                    Then in QML you can use them as model property: model.title.

                                    Lucas_1603L Offline
                                    Lucas_1603L Offline
                                    Lucas_1603
                                    wrote on last edited by Lucas_1603
                                    #21

                                    @intruderexcluder yes, I overrided it. When I use PlaylistModel as a model in QML, I actually just want to access m_data variable, not all of PlaylistModel attributes.
                                    Any suggestions to do that? Thanks a lot

                                    1 Reply Last reply
                                    0
                                    • IntruderExcluderI Offline
                                      IntruderExcluderI Offline
                                      IntruderExcluder
                                      wrote on last edited by
                                      #22

                                      You are probably doing something wrong, but you can at any time simply add slot or invokable method to access any data.

                                      1 Reply Last reply
                                      0
                                      • Lucas_1603L Lucas_1603

                                        @jksh Yes, it compiled.
                                        @JonB As you said, I can access m_data via data() and setData() method. In data(), I have to assign QModelIndex &index and int role to it .
                                        How I can use data() method with enum TitleRole?

                                        JKSHJ Offline
                                        JKSHJ Offline
                                        JKSH
                                        Moderators
                                        wrote on last edited by
                                        #23

                                        @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

                                        Yes, it compiled
                                        ...
                                        I actually just want to access m_data variable, not all of PlaylistModel attributes.

                                        Is Song still a subclass of QObject?

                                        Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                                        Lucas_1603L 1 Reply Last reply
                                        0
                                        • JKSHJ JKSH

                                          @lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":

                                          Yes, it compiled
                                          ...
                                          I actually just want to access m_data variable, not all of PlaylistModel attributes.

                                          Is Song still a subclass of QObject?

                                          Lucas_1603L Offline
                                          Lucas_1603L Offline
                                          Lucas_1603
                                          wrote on last edited by
                                          #24

                                          @jksh No, it's not now. I think I'm doing right way in this time ^^
                                          The challenge now is accessing to m_data to get title, singer, source, album_art.

                                          JKSHJ 1 Reply Last reply
                                          0

                                          • Login

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