Russian Qt Forum

Qt => Общие вопросы => Тема начата: Klaustrofob от Июнь 18, 2007, 14:29



Название: QList и объект класса, наследованного от QObject
Отправлено: Klaustrofob от Июнь 18, 2007, 14:29
[qt 4.2.3]
Делал следующее
Код:

class element: public QObject
{
Q_OBJECT
public:
element(void);
~element(void);
};

 
при попытке
Код:

element e;
QList<element> *list = new QList<element>;
list->append(e);

компилятор ругается на попытку вызова закрытого члена класса QObject
Как я понимаю, QList вызывает конструктор копирования, который у QObject сткрыт.
Подскажите, как избежать эту проблему.
Спасибо


Название: QList и объект класса, наследованного от QObject
Отправлено: SABROG от Июнь 18, 2007, 14:39
А если убрать Q_OBJECT ?


Название: QList и объект класса, наследованного от QObject
Отправлено: Emc от Июнь 18, 2007, 14:46
а если
Код:

QList<element*> list;
list.append(new element());


Название: QList и объект класса, наследованного от QObject
Отправлено: Klaustrofob от Июнь 18, 2007, 14:55
Цитата: "SABROG"
А если убрать Q_OBJECT ?

трабл остается, притом мне нужно будет реализовывать слоты в этом классе

Цитата: "Emc"

а если
Код:

QList<element*> list;
list.append(new element());


Видимо так и сделаю, правда не хотел использовать список указателей.
Более того, уже принципиально хочется понять, почему же это происходит.


Название: QList и объект класса, наследованного от QObject
Отправлено: WW от Июнь 18, 2007, 15:36
Цитата: "Klaustrofob"
Цитата: "SABROG"
А если убрать Q_OBJECT ?

трабл остается, притом мне нужно будет реализовывать слоты в этом классе

Цитата: "Emc"

а если
Код:

QList<element*> list;
list.append(new element());


Видимо так и сделаю, правда не хотел использовать список указателей.
Более того, уже принципиально хочется понять, почему же это происходит.

QList неявно вызывает присваивающий конструктор. Пропиши его у себя в классе и радуйся жизни.


Название: QList и объект класса, наследованного от QObject
Отправлено: Klaustrofob от Июнь 18, 2007, 15:52
Да, все правильно. Надо описать operator=() и конструктор копирования, тогда все работает.


Название: QList и объект класса, наследованного от QObject
Отправлено: Tonal от Июнь 18, 2007, 18:21
Цитата: "Klaustrofob"
... притом мне нужно будет реализовывать слоты в этом классе...

... не хотел использовать список указателей.
Более того, уже принципиально хочется понять, почему же это происходит.

Цитата: "Klaustrofob"
Надо описать operator=() и конструктор копирования, тогда все работает

Чтобы отработал слот, в функцию connect подаётся адрес объекта.
Внимание вопрос:
Если ты скопируешь объект то слот какого из объектов будет вызываться?

Насколько я понимаю, при некоторых операциях QList будет копировать объекты в нём содержащиеся.


Название: QList и объект класса, наследованного от QObject
Отправлено: Klaustrofob от Июнь 18, 2007, 23:15
Цитата: "Tonal"
Цитата: "Klaustrofob"
... притом мне нужно будет реализовывать слоты в этом классе...

... не хотел использовать список указателей.
Более того, уже принципиально хочется понять, почему же это происходит.

Цитата: "Klaustrofob"
Надо описать operator=() и конструктор копирования, тогда все работает

Чтобы отработал слот, в функцию connect подаётся адрес объекта.
Внимание вопрос:
Если ты скопируешь объект то слот какого из объектов будет вызываться?

Насколько я понимаю, при некоторых операциях QList будет копировать объекты в нём содержащиеся.


Большинство коннектов можно прописать в конструкторе, тогда проблем быть не должно. В другом случае, видимо, скопированный объект нужно присоединять отдельно.


Название: QList и объект класса, наследованного от QObject
Отправлено: Tonal от Июнь 19, 2007, 08:23
Ну нормальное решение.
Только нужно выяснить, какие операции с QList и его итераторами могут привести к копированию объектов и после них всегда корректировать конекты.
Ну и забить на то, что при каждом создании/разрушении временных объектов дёргаются механизмы привязки/отвязки коннектов.
Как работает foreach например?

Вот что по этому поводу написано в ассистенте:
Цитировать
The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator. This covers most data types you are likely to want to store in a container, including basic types such as int and double, pointer types, and Qt data types such as QString, QDate, and QTime, but it doesn't cover QObject or any QObject subclass (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a QList<QWidget>, the compiler will complain that QWidget's copy constructor and assignment operators are disabled. If you want to store these kinds of objects in a container, store them as pointers, for example as QList<QWidget *>.


Название: Re: QList и объект класса, наследованного от QObject
Отправлено: pastor от Январь 11, 2008, 23:39
Видимо так и сделаю, правда не хотел использовать список указателей.

По другому никак. В контейнерах типа QList, Qvector нельзя хранить объеты пораждённые от QObject. Можно только хранить указатели на них.