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.1k 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.
  • S sharath

    hi @lucas_1603,

    can we see your .cpp also?

    Have you added your definition of explicit Song(QObject *parent = nullptr);
    definition in .cpp?

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

    @sharath
    Yes, here it is:

    #include <song.h>
    Song::Song(QObject *parent) : QObject (parent)
    {
        this->title() = "Hello World";
        this->singer() = "Dac Luc";
        this->source() = "lll";
        this->album_art() = "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;
    }
    
    JonBJ 1 Reply Last reply
    0
    • Lucas_1603L Lucas_1603

      @sharath
      Yes, here it is:

      #include <song.h>
      Song::Song(QObject *parent) : QObject (parent)
      {
          this->title() = "Hello World";
          this->singer() = "Dac Luc";
          this->source() = "lll";
          this->album_art() = "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;
      }
      
      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #4

      @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 1 Reply Last reply
      1
      • 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

                                          • Login

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