crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> не вызывается слот при сигнале с деструктора
MishaUA
  опции профиля:
сообщение 25.11.2013, 17:02
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Допустим, есть такой код:
class ttt public QWidget {
    Q_OBJECT
public:
    ~ttt() {emit destSig("iiii");}
signals:
    destSig(QString);
};

class mw public QMainWindow {
    Q_OBJECT
public:
    mw() {
        ttt*    t = new ttt();
        connect(t, SIGNAL(destSig(QString)), this, SLOT(dest(QString)));
    }
    
public slots:
    dest(QString) {
        // не вызывается при разрушении класса t
    };
}

Проблема в том, что когда генерирую сигнал destSig по событию таймера или кнопки, то слот dest вызывается, но код должен быть устроен, так, чтобы при разрушении mw разрушался t и при этом вызывался слот dest, чего не происходит.
У меня есть предположения, что не вызывается из-за того, что mw уже разрушен, но наверно, ошибаюсь, потому что раньше так делал и оно работало.
Что можно сделать в данной ситуации?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Majestio
  опции профиля:
сообщение 25.11.2013, 17:53
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 67
Регистрация: 13.2.2013
Пользователь №: 3710

Спасибо сказали: 1 раз(а)




Репутация:   1  


Цитата(MishaUA @ 25.11.2013, 17:02) *
Допустим, есть такой код:
class ttt public QWidget {
    Q_OBJECT
public:
    ~ttt() {emit destSig("iiii");}
signals:
    destSig(QString);
};

class mw public QMainWindow {
    Q_OBJECT
public:
    mw() {
        ttt*    t = new ttt();
        connect(t, SIGNAL(destSig(QString)), this, SLOT(dest(QString)));
    }
    
public slots:
    dest(QString) {
        // не вызывается при разрушении класса t
    };
}

Проблема в том, что когда генерирую сигнал destSig по событию таймера или кнопки, то слот dest вызывается, но код должен быть устроен, так, чтобы при разрушении mw разрушался t и при этом вызывался слот dest, чего не происходит.
У меня есть предположения, что не вызывается из-за того, что mw уже разрушен, но наверно, ошибаюсь, потому что раньше так делал и оно работало.
Что можно сделать в данной ситуации?


А если попробовать вот так?

ttt*    t = new ttt(this);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 25.11.2013, 18:32
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


сорри, я немного спутал, у меня так и есть:
class ttt public QWidget {
    Q_OBJECT
public:
    ttt(QWidget* parent) : QWidget(parent){}
    ~ttt() {emit destSig("iiii");}
signals:
    destSig(QString);
};

class mw public QMainWindow {
    Q_OBJECT
public:
    mw() {
        ttt*    t = new ttt(this);
        connect(t, SIGNAL(destSig(QString)), this, SLOT(dest(QString)));
    }
    
public slots:
    dest(QString) {
        // не вызывается при разрушении класса t
    };
}
Но всеравно слот не вызывается, хотя через отладку видно, что в деструктор ~ttt() заходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 25.11.2013, 20:47
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Телепатически предсказываю, что mw создается в main, в котором что-то вроде
int main(int argc, char *argv[])
{
    QApplication application(argc, argv);

    mw w;
    w.show();
    return application.exec();
}


Получается, что mw разрушается при выходе из main. А в это время цикл опрапотки сообщений (application.exec) уже остановился.
Или удаляй t в событии закрытия mw. http://qt-project.org/doc/qt-4.8/qwidget.html#closeEvent
Или попробуй создавать окно через new и поставить ему аттрибут Qt::WA_DeleteOnClose mw http://qt-project.org/doc/qt-4.8/qt.html#W...tAttribute-enum .

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.11.2013, 13:51
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(MishaUA @ 25.11.2013, 20:02) *
Допустим, есть такой код:
class ttt public QWidget {


и что, компилятор понимает отсутствие двоеточия перед public ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 2.12.2013, 11:59
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Ставлю на версию Sokoloff!
Такое уже несколько раз обсуждалось.

Алексей1153, скорей всего, текст писался по памяти, а не копипастом. Вряд ли кто-то в здравом уме станет называть свой класс ttt.

Сообщение отредактировал Анна - 2.12.2013, 12:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 13:43