error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'"
-
@lucas_1603 Where exactly do you get the error?
The problem: QObject instances are NOT copyable. -
@lucas_1603
I'm not an expert C++-er, but:-
Did you re-run
qmake
after adding theQ_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_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. -
Hi,
Are you maybe using the copy constructor somewhere ?
-
It means that somewhere in your code you are using the copy constructor which is disabled since QObject objects cannot be copied.
-
@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
-
@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.
-
@lucas_1603
You can only accessprivate
variables in the class which defines them. So expose a getter/setter if you really need to. But sinceQAbstractListModel
already hasdata()
&setData()
methods you would normally go via those. -
@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.
-
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
. -
@intruderexcluder yes, I overrided it. When I use
PlaylistModel
as a model in QML, I actually just want to accessm_data
variable, not all of PlaylistModel attributes.
Any suggestions to do that? Thanks a lot -
You are probably doing something wrong, but you can at any time simply add slot or invokable method to access any data.
-
@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 accessm_data
variable, not all of PlaylistModel attributes.Is Song still a subclass of QObject?
-
@lucas_1603 said in error: "'QObject::QObject(const QObject&)' is private" and "use of deleted function 'QObject::QObject(const QObject&)'":
I think I'm doing right way in this time ^^
There's often more than 1 way to achieve something; some are just easier or more efficient than others :)
The challenge now is accessing to
m_data
to get title, singer, source, album_art.I see that you've implemented a Model. The idea behind a model is that you shouldn't need to access the internal data structure directly. Instead, you use the model's standard interface (rows, columns, and maybe roles) to access individual fields.
In your example, you can treat each Row as an individual song. You can also treat each Column as a song field (e.g. Col 1 = Title, Col 2 = Singer, etc.). Older examples use Roles instead of Columns
In QML, you normally don't call
data()
andsetData()
directly; you let the View and Delegate call them for you.Spend some time getting to know the model-view framework first:
- https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html
- https://doc.qt.io/qt-5/qtquick-models-objectlistmodel-example.html
This is quite a lengthy topic, so it's not something that we can teach you over a few forum posts. You need to spend time going through examples and modifying them to see how they behave. trying things out.