Russian Qt Forum
Ноябрь 24, 2024, 23:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QList и объект класса, наследованного от QObject  (Прочитано 8324 раз)
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 сткрыт.
Подскажите, как избежать эту проблему.
Спасибо
Записан
SABROG
Гость
« Ответ #1 : Июнь 18, 2007, 14:39 »

А если убрать Q_OBJECT ?
Записан
Emc
Гость
« Ответ #2 : Июнь 18, 2007, 14:46 »

а если
Код:

QList<element*> list;
list.append(new element());
Записан
Klaustrofob
Гость
« Ответ #3 : Июнь 18, 2007, 14:55 »

Цитата: "SABROG"
А если убрать Q_OBJECT ?

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

Цитата: "Emc"

а если
Код:

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


Видимо так и сделаю, правда не хотел использовать список указателей.
Более того, уже принципиально хочется понять, почему же это происходит.
Записан
WW
Гость
« Ответ #4 : Июнь 18, 2007, 15:36 »

Цитата: "Klaustrofob"
Цитата: "SABROG"
А если убрать Q_OBJECT ?

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

Цитата: "Emc"

а если
Код:

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


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

QList неявно вызывает присваивающий конструктор. Пропиши его у себя в классе и радуйся жизни.
Записан
Klaustrofob
Гость
« Ответ #5 : Июнь 18, 2007, 15:52 »

Да, все правильно. Надо описать operator=() и конструктор копирования, тогда все работает.
Записан
Tonal
Гость
« Ответ #6 : Июнь 18, 2007, 18:21 »

Цитата: "Klaustrofob"
... притом мне нужно будет реализовывать слоты в этом классе...

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

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

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

Насколько я понимаю, при некоторых операциях QList будет копировать объекты в нём содержащиеся.
Записан
Klaustrofob
Гость
« Ответ #7 : Июнь 18, 2007, 23:15 »

Цитата: "Tonal"
Цитата: "Klaustrofob"
... притом мне нужно будет реализовывать слоты в этом классе...

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

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

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

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


Большинство коннектов можно прописать в конструкторе, тогда проблем быть не должно. В другом случае, видимо, скопированный объект нужно присоединять отдельно.
Записан
Tonal
Гость
« Ответ #8 : Июнь 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 *>.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Январь 11, 2008, 23:39 »

Видимо так и сделаю, правда не хотел использовать список указателей.

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.