2015-03-14 3 views
2

Я сделал простую программу:QT сигнал и слоты внутри второго класса

Что запустить основную программу -> программа класса -> второй класс

Пусть мы видим код:

главную программа:

QApplication a(argc, argv); 
testqtc w; // this one intresting i call this 'first_class' 
w.show(); 
return a.exec(); 
} 

В 'first_class' у меня есть:

testqtc::testqtc(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    ui.setupUi(this); 
    QTimer *timer = new QTimer(this); 
    bool p = connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption2())); 
    std::cout << p; 
    timer->start(1000); 

    class1 class1(this); // i call this 'second class' which run under first class 
} 
void testqtc::updateCaption2(){ 
    std::cout << "first_class" << std::endl; 
} 

В 'второго класса' у меня есть:

class1::class1(QObject *parent) 
    : QObject(parent) 
{ 
    QTimer *timer = new QTimer(this); 
    bool p = connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption())); 
    std::cout << p; 
    timer->start(1000); 
} 
void class1::updateCaption(){ 
    std::cout << "second class" << std::endl; 
} 

Выход:

11first_class 
first_class 
first_class (-> and only first_class per second) 

Это очевидно, что разъем второго класса обыкновению начал. Функция connect return true, но слот не выполняется.

Как использовать функцию соединения в 'second_class'?

ответ

1

class1 экземпляр выделяется в стеке в testqtc конструктора, это означает, что разрушается, прежде чем он может позвонить слот тайм-аут, чтобы решить ее передать его на куче:

class1* class1_ptr = new class1 (this); 
+0

или переместить Class1 к объекту членов и инициализируйте его в списке инициализаторов, а не в корпусе конструктора. – user3528438

+0

@ user3528438 Рекомендуемый способ выделения дочерних QObjects (QObjects, у которых есть родительский элемент) - это куча, если вы выделяете в стек QObject, у которого есть родительский элемент, вам нужно быть осторожным, чтобы этот объект был выделен до его родительского контроля, но при необходимости указатель может быть членом. – Zlatomir

+0

Что случилось, если ребенок не был выделен перед родителем? http://stackoverflow.com/questions/28820450/how-to-safely-delete-a-qtqtcpsocket – user3528438

Смежные вопросы