Название: Синглтон для QWidget Отправлено: horror812 от Март 28, 2011, 15:12 Всем привет
У меня вопрос делаю класс для вывода информации делаю как синглтон от QWidget, что бы вызывать мог из любого места. компилирую ошибок нету, но при запуске "Отправить отчет в Виндоус..." Можно ли это сделать? Попробовал синглтон для QObject Так работает, но потом мне нужно делать connect к моим слотам, к примеру в моем оутпуте, но это не удобно... если нет то какие идеи? ПС Вызываю instance после создание QApplication и Главного окна... Код: H: Спасибо Название: Re: Синглтон для QWidget Отправлено: fuCtor от Март 28, 2011, 15:20 Стек смотрели? В каком месте падает?
Название: Re: Синглтон для QWidget Отправлено: Akon от Март 28, 2011, 15:28 Ну ты небось своему виджету и парента ставишь (в лэйаут какой-нибудь вставляешь)?
Название: Re: Синглтон для QWidget Отправлено: ecspertiza от Март 28, 2011, 15:39 На мой взгляд синглтон от виджета это зло, для настроек самое оно, но для виджета зло :) Может лучше стоит поработать над архитектурой и делать обычный вызов ? Вообще расскажи на кой тебе виджет синглтон? что за инфа в нем будет что ее нужно вызывать отовсюду?
Название: Re: Синглтон для QWidget Отправлено: ufna от Март 28, 2011, 15:44 http://ufna.ru/2010/04/24/singleton-for-qt
замени только на виджет и все Название: Re: Синглтон для QWidget Отправлено: horror812 от Март 28, 2011, 17:40 Всем спасибо
fuCtor ошибка при прикрепление его у окну. приложение QApplication и Главное окно уже созданы... лайоут->AddWidget(Output::instance() ) Akon Да, после первого вызова instance добавляю его к форме, а как еще его отобразить)) ecspertiza Возможно, пока новичок. А как посоветуете? к примеру есть главное окно на нем есть табы (как в notepad++) в этом табе и в других виджетакх, которые как то могут отобржаться при возникновение как-либо действий (к примеру ошибка или предупреждение или просто инфа - для пользователя программы) выводится в этот output, который прицеплен в главном окне. Передавать каждому "ребенку" еще виджет-оутпут не удобно. Сначала я сделал так Создал синглтон от QObject ему в добавил сигнал trace(..str) И когда создал свой виджет output его connect к моему синглтоновскому объекту (QObject) Так, работало и я попробовал убрать QObject и сделать напрямую QWidget синглтоном... еще подумаю или вернусь к старому решению.. ufna Ок, Попробую- Интересно) Название: Re: Синглтон для QWidget Отправлено: fuCtor от Март 28, 2011, 19:06 Опасное решение, а если layout с виджетом на котором он лежит уничтожиться, то и объект в синглтоне умрет, опасно это. Хотя сам делал подобное в виде API внутреннего, но для обращения к объекту делал класс обертку на ним, куда помещал указатель на созданный объект в процессе загрузки. Существование контролировал через QPointer. B и все отлично работает. Если каким-то чудом объект удалиться, то все вызовы методов обертки буду корректно отрабатывать в любом случае.
Да, экземпляр обертки статическая переменная. Название: Re: Синглтон для QWidget Отправлено: ecspertiza от Март 28, 2011, 19:29 Я может чего то не понимаю, а почему нельзя сделать в главном окне слот который будет принимать сигналы от "детей" и помещать необходимые данные в output ? :)
Название: Re: Синглтон для QWidget Отправлено: fuCtor от Март 28, 2011, 19:33 Тут зависит от того из каких глубин нужно добираться до требуемого объекта.
Название: Re: Синглтон для QWidget Отправлено: ufna от Март 28, 2011, 20:43 Если лейаут сдохнет, то виджет не сдохнет. Так что опасностей нет. у синглтона родителя быть не должно, как следствие, ноу проблем, куда не суй :)
Название: Re: Синглтон для QWidget Отправлено: fuCtor от Март 29, 2011, 15:36 Если лейаут сдохнет, то виджет не сдохнет. Так что опасностей нет. у синглтона родителя быть не должно, как следствие, ноу проблем, куда не суй :) А документация говорит иначе: Цитировать void QLayout::addItem ( QLayoutItem * item ) [pure virtual] Implemented in subclasses to add an item. How it is added is specific to each subclass. This function is not usually called in application code. To add a widget to a layout, use the addWidget() function; to add a child layout, use the addLayout() function provided by the relevant QLayout subclass. Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it. void QLayout::addWidget ( QWidget * w ) Adds widget w to this layout in a manner specific to the layout. This function uses addItem(). Получается что удалив виджет на который помещен layout удалиться и синглтон,т.к. будет назначен родитель. Название: Re: Синглтон для QWidget Отправлено: ufna от Март 29, 2011, 16:48 Хмм, интересненько. Надо подумать.
Название: Re: Синглтон для QWidget Отправлено: fuCtor от Март 29, 2011, 16:58 Наиболее безопасный и 100% рабочий вариант это обернуть все в некоторый контейнер, как уже писал выше. Можно в синглтоне держать QObject который будет проксировать либо прямые вызовы, либо через QMetaObject:invokeMethod. И добавить в него метод attach, который будет принимать указатель на виджет и помещать в QPointer, чтобы контролировать его существование. Да немного грамоздко в реализации, зато безопасно.
При необходимости может выставлять из обертки указатель на прикрепленный объект наружу (для dynamic_cast). А по поводу виджета без родителя, это уже top-level окно, а любой контрол на форме имеет родителем виджет, на котором расположен. |