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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Когда вызывается сигнал destroyed()  (Прочитано 7515 раз)
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]   Вверх
  Печать  
 
Перейти в:  


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