Пусть есть вот такие часы:
#ifndef _ASTIME_H_53828_
#define _ASTIME_H_53828_
#include <QtGui>
class AsTime : public QLabel
{
Q_OBJECT
public:
AsTime( QWidget* parent = 0 );
public slots:
void update();
};
#endif /* _ASTIME_H_53828_ */
#include "astime.h"
void clockWork( QObject* parent )
{
QEventLoop loop;
QTimer timer;
timer.setInterval( 500 );
timer.start();
QObject::connect( &timer, SIGNAL( timeout() ), parent, SLOT( update() ) );
QObject::connect( parent, SIGNAL( destroyed() ), &loop, SLOT( quit() ) );
// QObject::connect( QCoreApplication::instance(), SIGNAL( aboutToQuit() ), &loop, SLOT( quit() ) );
loop.exec();
}
AsTime::AsTime( QWidget* parent ) : QLabel( QTime::currentTime().toString(), parent )
{
this->setAlignment( Qt::AlignCenter );
}
void AsTime::update()
{
this->setText( QTime::currentTime().toString() );
}
В main'е запускается главная петля событий, создаётся и отображается экземпляр AsTime. Всё работает. При закрытие окна приложение либо завершается, либо (как правило) нет. Если раскомментировать строчку с выходом из локальной петли событий по aboutToQuit сигналу, то приложение как правило завершается после закрытия окна, но иногда этого не делает. Я кажется что-то не понимаю в передаче сигналов между потоками и что-то делаю не так. Собственно три вопроса: что же я делаю не так? почему результат зависит от фазы сириуса? существует ли какой-то дебагер для ковыряния в Qt'шном рантайме (имеются в виду сигналы, слоты, события)?