Ad.1. Время жизни списка должно совпадать с временем жизни экземпляра MyWidget, чтобы вы могли безопасно создавать список в стеке.
Ad.2. Вы можете сделать это, но класс MyObject должен иметь конструктор по умолчанию, конструктор копирования и оператор присваивания (подробности см. http://doc.trolltech.com/4.6/containers.html#container-classes).
Ad.3. Право собственности на объект не передается в приложение. Как и контейнеры STL, контейнеры Qt не вызывают delete для сохраненных указателей. Чтобы удалить все указатели, хранящиеся в QList (или другом контейнере Qt), вы можете использовать qDeleteAll (list). Имейте в виду, что вы, вероятно, не хотите делать это в коде, который вы разместили: вы передаете указатель MyWidget конструктору MyObject, и я предполагаю, что он затем используется в качестве родительского QObject. Поэтому все объекты QObject будут удалены при удалении MyWidget.
Ad.4. Второй аргумент макроса foreach должен быть контейнером, а не указателем на контейнер. Поэтому вы должны вызывать foreach (MyObject * obj, * list), если ваша переменная списка является указателем на QList.
Ad.5. Все будет в порядке, если MyOtherWidget не удаляет переданный MyObject (потому что MyWidget уже является родителем MyObject, и вы в конечном итоге удалите один и тот же объект дважды).
Это грубое упрощение, но вы должны попытаться написать свой код таким образом, чтобы вам вообще не нужно было вызывать delete. Создавайте вещи в стеке или используйте механизм Qt parent-children (то есть родители удаляют своих детей). Позже вы можете захотеть прочитать об умных указателях (QSharedPointer, QScopedPointer и т. Д.).
EDIT:
Будет ли установлен родитель MyObject или нет, зависит от того, что вы делаете в конструкторе MyObject. Если вы передаете родительский аргумент конструктору QObject, то есть ваш конструктор Myobject выглядит следующим образом:
MyObject(const QString &text, QObject *parent = 0) : QObject(parent)
{
// more code...
}
родитель будет установлен, потому что это будет сделано в конструкторе QObject, который будет вызываться из-за кода ": QObject (parent)". Что делать, если у вас нет этого фрагмента? Поскольку MyObject наследует QObject, и вы не указываете, какой конструктор следует называть конструктором QObject по умолчанию, то есть будет вызываться QObject (QObject * parent = 0), поэтому родительский элемент вашего MyObject будет иметь значение NULL и не будет Исключен.
Я бы старался избегать явной установки parent с помощью метода setParent - для базовых сценариев установки родительской функции в конструкторе должно быть достаточно.
Старайтесь использовать правильную терминологию (не «метод экземпляра», а «конструктор»), читайте документацию Qt, руководствуйтесь здравым смыслом и старайтесь не думать, что что-то будет сделано автоматически. Родитель не устанавливается «автоматически» только потому, что вы называете один аргумент «родительским» - он установлен, потому что есть фрагмент кода, который делает это в конструкторе QObject, и вы обязаны вызвать передачу соответствующего родителя конструктору QObject в классах которые наследуют QObject.