Вызов слота QT Widget не активируется отдельным потоком сигнала - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть 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();
}

1 Ответ

1 голос
/ 30 сентября 2011

На это ссылалась ссылка, которую Джереми добавил в комментарии к моему вопросу, но для ясности:

Решение было добавить:

qRegisterMetaType<shared_ptr<Measurement> >("shared_ptr<Measurement>");

непосредственно перед вызовом для подключения.

...