У меня есть 5 классов, которые взаимодействуют (поддерживая профессионально, а не автор). Моя проблема в том, что код, который излучает сигнал (есть только один, код ниже), никогда не активирует слот (MyWidget :: HandleMeasurementChanged). Эта система имеет большую степень сложности. Я пытался уменьшить это, но думаю, что сложность, вероятно, усугубляет проблему. Также существует высокий уровень вызовов Observer :: notify, но большинство из них будут отфильтрованы по коду, который я не разместил здесь, и вызовы Emit довольно редки. Если бы кто-нибудь мог подсказать мне, почему слот не активируется, я был бы очень признателен. Он почти действует так, будто экземпляр класса MyWidget не обрабатывает свой цикл обработки событий. У меня был небольшой успех, установив тип соединения для Direct Connection, но поскольку emit находится в отдельном потоке, а рабочий код для слота обновит пользовательский интерфейс, который я исключил, в качестве окончательного решения.
class IObserver { public: virtual void notify()=0; };
class ExternalMeasurement { ... };
class Measurement { public: Measurement(ExternalMeasurement source); };
class Observer : public QThread, public IObserver
{
signals:
void MeasurementChanged(boost::shared_ptr<Measurement> measurement);
public:
//called by 3rd party in separate thread
virtual void notify(ExternalMeasurement measurement)
{
_measurement_ =
boost::shared_ptr<Measurement>(new Measurement(measurement));
emit MeasurementChanged(_measurement);
}
private:
boost::shared_ptr<Measurement> _measurement_;
};
class MyWidget : public QWidget
{
private:
Component _component_;
public slots:
void HandleMeasurementChanged(boost::shared_ptr<Measurement> measurement);
public:
MyWidget(Component * component_)
};
MyWidget::MyWidget(Component * component_)
{
_component_ = component_;
connect(
_component_->_observer_,
MeasurementChanged(boost::shared_ptr<Measurement> measurement),
this,
HandleMeasurementChanged(boost::shared_ptr<Measurement> measurement));
}
class Component
{
private:
QApplication * _application_;
MyWidget * _widget_;
Observer * _observer_;
public:
void MainFunc();
}
void Component::MainFunc()
{
_observer_ = new Observer();
...
_application_ = new QApplication(...);
...
_widget_ = new MyWidget(...);
...
_widget_->show();
_application_->exec();
}