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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Когда вызывается сигнал destroyed()  (Прочитано 7188 раз)
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
Записан
Bepec
Гость
« Ответ #1 : Декабрь 01, 2012, 01:47 »

Хы хы хы хы хы ) А вы в словах напишите алгоритм вызова этого слота.
Т.е. он должен вызваться после уничтожения объекта? Улыбающийся
Записан
Impuls
Гость
« Ответ #2 : Декабрь 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.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Декабрь 01, 2012, 10:53 »

Скажите этот сигнал когда-нибудь вызывается, или он теперь идет только как заглушка? Версия Qt 4.7.4
Сигнал вызывается, но для слотов других "живых" объектов.
Записан

Qt 5.11/4.8.7 (X11/Win)
Impuls
Гость
« Ответ #4 : Декабрь 01, 2012, 11:03 »

Скажите этот сигнал когда-нибудь вызывается, или он теперь идет только как заглушка? Версия Qt 4.7.4
Сигнал вызывается, но для слотов других "живых" объектов.

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

Тогда как мне поступить если у меня в классе создается множество потоков? Я хотел привязать их слот deleteLetter() к сигналу destroyed(). Тогда бы, при закрытии приложения, потоки бы завершались корректно.
Записан
_OLEGator_
Гость
« Ответ #5 : Декабрь 01, 2012, 12:03 »

про деструктор слышал?
Записан
Impuls
Гость
« Ответ #6 : Декабрь 01, 2012, 12:18 »

про деструктор слышал?

Пока так и делаю, но интереснее было бы удалять потоки через destroyed - иначе я не особо представляю за чем он был сделан.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Декабрь 01, 2012, 12:26 »

иначе я не особо представляю за чем он был сделан.
Извещать других заинтересованных лиц о своей кончине)
Записан

Qt 5.11/4.8.7 (X11/Win)
_OLEGator_
Гость
« Ответ #8 : Декабрь 01, 2012, 12:39 »

имхо, не стоит использовать сигналы и слоты там, где легко можно обойтись без них.
Записан
Kolobok
Гость
« Ответ #9 : Декабрь 01, 2012, 12:45 »

Я хотел привязать их слот deleteLetter() к сигналу destroyed().

Зачем  уничтожать уже уничтоженнный обьект?
Записан
Impuls
Гость
« Ответ #10 : Декабрь 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. Вот мне и было интересно с чего бы это.
Записан
Impuls
Гость
« Ответ #11 : Декабрь 01, 2012, 12:52 »

Я хотел привязать их слот deleteLetter() к сигналу destroyed().

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

К сигналу destroyed() другого класса. См. выше
Записан
Kolobok
Гость
« Ответ #12 : Декабрь 01, 2012, 17:57 »

Лучше соединять слот deleteLater() потока с его же сигналом finished().
Записан
Impuls
Гость
« Ответ #13 : Декабрь 01, 2012, 18:58 »

Лучше соединять слот deleteLater() потока с его же сигналом finished().

Хм. А это идея. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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