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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Синглтон для QWidget  (Прочитано 6548 раз)
horror812
Гость
« : Март 28, 2011, 15:12 »

Всем привет
У меня вопрос
делаю класс для вывода информации
делаю как синглтон от QWidget, что бы вызывать мог из любого места.
компилирую ошибок нету, но при запуске "Отправить отчет в Виндоус..."
Можно ли это сделать?
Попробовал синглтон для QObject
Так работает, но потом мне нужно делать connect к моим слотам, к примеру в моем оутпуте,
но это не удобно...
если нет то какие идеи? 
ПС Вызываю instance после создание QApplication и Главного окна...
Код:
H:

class Output : public QPlainTextEdit
{
  Q_OBJECT

private:
   Output ();

public:
   static Output*    instance();
    void  release();

public slots:
    void  trace(const QString &text,const QColor &color);

private:
    void  echo(const QString &text);

    static Output* _instance;

};

CPP:

Output*   Output::_instance = 0;

Output*   Output::instance()
{
    if(!_instance) _instance = new Output();
    return _instance;
}

void    Output::release()
{
    if(_instance)
    {
        delete _instance;
        _instance = 0;
    }
}



Спасибо
Записан
fuCtor
Гость
« Ответ #1 : Март 28, 2011, 15:20 »

Стек смотрели? В каком месте падает?
Записан
Akon
Гость
« Ответ #2 : Март 28, 2011, 15:28 »

Ну ты небось своему виджету и парента ставишь (в лэйаут какой-нибудь вставляешь)?
« Последнее редактирование: Март 28, 2011, 15:47 от Akon » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Март 28, 2011, 15:39 »

На мой взгляд синглтон от виджета это зло, для настроек самое оно, но для виджета зло Улыбающийся Может лучше стоит поработать над архитектурой и делать обычный вызов ? Вообще расскажи на кой тебе виджет синглтон? что за инфа в нем будет что ее нужно вызывать отовсюду?
Записан
ufna
Гость
« Ответ #4 : Март 28, 2011, 15:44 »

http://ufna.ru/2010/04/24/singleton-for-qt

замени только на виджет и все
Записан
horror812
Гость
« Ответ #5 : Март 28, 2011, 17:40 »

Всем спасибо

fuCtor
ошибка  при прикрепление его у окну.
приложение QApplication и Главное окно уже созданы... 
лайоут->AddWidget(Output::instance() )


Akon
Да, после первого вызова instance добавляю его к форме, а как еще его отобразить))

ecspertiza
Возможно, пока новичок.
А как посоветуете? к примеру есть главное окно на нем есть табы (как в notepad++)
в этом табе и в других виджетакх, которые как то могут отобржаться
при возникновение как-либо действий (к примеру ошибка или предупреждение или просто инфа - для пользователя программы)
выводится в этот output, который прицеплен в главном окне.
Передавать каждому "ребенку" еще виджет-оутпут не удобно.
Сначала я сделал так
Создал синглтон от QObject
ему в добавил сигнал trace(..str)
И когда создал свой виджет output его connect к моему синглтоновскому объекту (QObject)
Так, работало и я попробовал убрать QObject и сделать напрямую  QWidget синглтоном...
еще подумаю или вернусь к старому решению..

ufna Ок, Попробую- Интересно)
Записан
fuCtor
Гость
« Ответ #6 : Март 28, 2011, 19:06 »

Опасное решение, а если layout с виджетом на котором он лежит уничтожиться, то и объект в синглтоне умрет, опасно это. Хотя сам делал подобное в виде API внутреннего, но для обращения к объекту делал класс обертку на ним, куда помещал указатель на созданный объект в процессе загрузки. Существование контролировал через QPointer. B и все отлично работает. Если каким-то чудом объект удалиться, то все вызовы методов обертки буду корректно отрабатывать в любом случае.
Да, экземпляр обертки статическая переменная.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Март 28, 2011, 19:29 »

Я может чего то не понимаю, а почему нельзя сделать в главном окне слот который будет принимать сигналы от "детей" и помещать необходимые данные в output ?  Улыбающийся
Записан
fuCtor
Гость
« Ответ #8 : Март 28, 2011, 19:33 »

Тут зависит от того из каких глубин нужно добираться до требуемого объекта.
Записан
ufna
Гость
« Ответ #9 : Март 28, 2011, 20:43 »

Если лейаут сдохнет, то виджет не сдохнет. Так что опасностей нет. у синглтона родителя быть не должно, как следствие, ноу проблем, куда не суй Улыбающийся
Записан
fuCtor
Гость
« Ответ #10 : Март 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 удалиться и синглтон,т.к. будет назначен родитель.
« Последнее редактирование: Март 29, 2011, 15:39 от fuCtor » Записан
ufna
Гость
« Ответ #11 : Март 29, 2011, 16:48 »

Хмм, интересненько. Надо подумать.
Записан
fuCtor
Гость
« Ответ #12 : Март 29, 2011, 16:58 »

Наиболее безопасный и 100% рабочий вариант это обернуть все в некоторый контейнер, как уже писал выше. Можно в синглтоне держать QObject который будет проксировать либо прямые вызовы, либо через QMetaObject:invokeMethod. И добавить в него метод attach, который будет принимать указатель на виджет и помещать в QPointer, чтобы контролировать его существование. Да немного грамоздко в реализации, зато безопасно.
При необходимости может выставлять из обертки указатель на прикрепленный объект наружу (для dynamic_cast).

А по поводу виджета без родителя, это уже top-level окно, а любой контрол на форме имеет родителем виджет, на котором расположен.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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