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&)'"
QtWS25 Last Chance

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.0k Views
  • 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.
  • Lucas_1603L Offline
    Lucas_1603L Offline
    Lucas_1603
    wrote on last edited by Lucas_1603
    #1

    Hi all,
    I have a Song class like this:

    #include <QObject>
    class Song : public QObject
    {
        Q_OBJECT
    public:
        Song(const QString &title, const QString &singer, const QString &source, const QString &albumArt);
        explicit Song(QObject *parent = nullptr);
        Q_INVOKABLE QString title() const;
        QString singer() const;
        QString source() const;
        QString album_art() const;
    
    private:
        QString m_title;
        QString m_singer;
        QString m_source;
        QString m_albumArt;
    };
    

    This returned some errors below:

    'QObject::QObject(const QObject&)' is private within this context
    use of deleted function 'QObject::QObject(const QObject&)'
    

    Why I got these errors and how can I deal with it? Thanks for your help

    Regard

    S 1 Reply Last reply
    0
    • Lucas_1603L Lucas_1603

      Hi all,
      I have a Song class like this:

      #include <QObject>
      class Song : public QObject
      {
          Q_OBJECT
      public:
          Song(const QString &title, const QString &singer, const QString &source, const QString &albumArt);
          explicit Song(QObject *parent = nullptr);
          Q_INVOKABLE QString title() const;
          QString singer() const;
          QString source() const;
          QString album_art() const;
      
      private:
          QString m_title;
          QString m_singer;
          QString m_source;
          QString m_albumArt;
      };
      

      This returned some errors below:

      'QObject::QObject(const QObject&)' is private within this context
      use of deleted function 'QObject::QObject(const QObject&)'
      

      Why I got these errors and how can I deal with it? Thanks for your help

      Regard

      S Offline
      S Offline
      sharath
      wrote on last edited by sharath
      #2

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

                                          • Login

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