Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Impuls от Декабрь 01, 2012, 01:12



Название: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 01:12
Доброго времени суток уважаемые эксперты. Вот столкнулся с непонятной для меня проблемой. Никак не могу врубиться когда же вызывается этот злосчастный сигнал destroyed().
Набросал небольшой примерчик:
Код:
#ifndef TTT_H
#define TTT_H

#include <QObject>
#include <QDebug>

class TTT : public QObject
{
    Q_OBJECT
public:
    TTT(QObject *parent = 0){
        connect(this, SIGNAL(destroyed()), this, SLOT(tmp()));
    }

signals:

public slots:
    void tmp(){
        qDebug()<<"END";
    }
};

#endif // TTT_H


#include <QApplication>
#include "TTT.h"


int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    TTT *ttt = new TTT;
    delete ttt;
    return app.exec();
}


Слот tmp никогда не вызывается. Помогает лишь явный вызов функции tmp в деструткторе. Скажите этот сигнал когда-нибудь вызывается, или он теперь идет только как заглушка? Версия Qt 4.7.4


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Bepec от Декабрь 01, 2012, 01:47
Хы хы хы хы хы ) А вы в словах напишите алгоритм вызова этого слота.
Т.е. он должен вызваться после уничтожения объекта? :)


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 10:39
Хы хы хы хы хы ) А вы в словах напишите алгоритм вызова этого слота.
Т.е. он должен вызваться после уничтожения объекта? :)

Ну, насколько я понимаю документацию, он должен вызываться непосредственно перед вызовом деструктора.
This signal is emitted immediately before the object obj is destroyed, and can not be blocked.

All the objects's children are destroyed immediately after this signal is emitted.


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: GreatSnake от Декабрь 01, 2012, 10:53
Скажите этот сигнал когда-нибудь вызывается, или он теперь идет только как заглушка? Версия Qt 4.7.4
Сигнал вызывается, но для слотов других "живых" объектов.


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 11:03
Скажите этот сигнал когда-нибудь вызывается, или он теперь идет только как заглушка? Версия Qt 4.7.4
Сигнал вызывается, но для слотов других "живых" объектов.

И в правду. Непонятно почему в документации написано что сигнал вызывается до уничтожения объекта?

Тогда как мне поступить если у меня в классе создается множество потоков? Я хотел привязать их слот deleteLetter() к сигналу destroyed(). Тогда бы, при закрытии приложения, потоки бы завершались корректно.


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: _OLEGator_ от Декабрь 01, 2012, 12:03
про деструктор слышал?


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 12:18
про деструктор слышал?

Пока так и делаю, но интереснее было бы удалять потоки через destroyed - иначе я не особо представляю за чем он был сделан.


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: GreatSnake от Декабрь 01, 2012, 12:26
иначе я не особо представляю за чем он был сделан.
Извещать других заинтересованных лиц о своей кончине)


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: _OLEGator_ от Декабрь 01, 2012, 12:39
имхо, не стоит использовать сигналы и слоты там, где легко можно обойтись без них.


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Kolobok от Декабрь 01, 2012, 12:45
Я хотел привязать их слот deleteLetter() к сигналу destroyed().

Зачем  уничтожать уже уничтоженнный обьект?


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 12:51
имхо, не стоит использовать сигналы и слоты там, где легко можно обойтись без них.

Как сказать. Я бы мог использовать массив всех потоков и проходить их по очереди, но красивее сделать так:
Код:
Worker *w = new Worker;
QThread *t = new QThread;
w->moveToThread(t);
connect(this, SIGNAL(destroyed()), w, SLOT(stop()));
connect(w, SIGNAL(finished()), t, SLOT(quit()));
connect(w, SIGNAL(finished()), w, SLOT(deleteLater()));
t->start();

Но ведь оно так не работает, потому что сигнал destroyed() не доходит до класса Worker. Вот мне и было интересно с чего бы это.


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 12:52
Я хотел привязать их слот deleteLetter() к сигналу destroyed().

Зачем  уничтожать уже уничтоженнный обьект?

К сигналу destroyed() другого класса. См. выше


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Kolobok от Декабрь 01, 2012, 17:57
Лучше соединять слот deleteLater() потока с его же сигналом finished().


Название: Re: Когда вызывается сигнал destroyed()
Отправлено: Impuls от Декабрь 01, 2012, 18:58
Лучше соединять слот deleteLater() потока с его же сигналом finished().

Хм. А это идея. Спасибо.