Объект 1 класса отсылает сигнал объекту 2 класса, тот при получении сигнала, отвечает. Получается некий цикл. Программа завершается с ошибкой через 3580 таких итераций на Qt4.8, через 3683 на Qt4.7.
Не пойму почему крашится.
//main.cpp
int main(int argc, char *argv[])
{
...
MainWindow w;
Second s;
QObject::connect( &w,SIGNAL(go()), &s,SLOT(go()) );
QObject::connect( &s,SIGNAL(back()), &w,SLOT(back()) );
...
}
//mainwindow.h
class MainWindow : public QMainWindow
{
...
private:
int VALUE;
int MAX_VALUE;
private slots:
void on_pushButton_clicked();
public slots:
void back();
signals:
void go();
};
//mainwindow.cpp
void MainWindow::on_pushButton_clicked()
{
VALUE = 0;
MAX_VALUE = 10000;
emit go();
}
void MainWindow::back()
{
qDebug() << VALUE;
if(VALUE<MAX_VALUE)
{
VALUE++;
emit go();
}
}
//second.h
class Second : public QObject
{
...
signals:
void back();
public slots:
void go();
};
//second.cpp
void Second::go()
{
emit back();
}
Поскольку оба объекта в одном потоке, вызовы слотов происxодят как вызовы обычных функций и получается бесконечная рекурсия:
void a() {
b();
}
void b() {
a();
}
a();
Решил проблему.
Добавил Qt::QueuedConnection и сигнал стал отправляться после отработки вызвавшей его функции.
lanz, спасибо, через QTimer тоже можно.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)