Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: horror812 от Март 28, 2011, 15:12



Название: Синглтон для QWidget
Отправлено: 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;
    }
}



Спасибо


Название: 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 окно, а любой контрол на форме имеет родителем виджет, на котором расположен.