繁体   English   中英

QT小部件插槽调用未由单独的线程信号激活

[英]QT Widget Slot Call Not Activated by Separate Thread Signal

我有5个互动的类(专业维护,而不是作者维护)。 我的问题是,发出信号的代码(下面只有一个,下面的代码)从未激活插槽(MyWidget :: HandleMeasurementChanged)。 该系统具有高度的复杂性。 我试图减少这种情况,但认为复杂性可能是导致问题的原因。 对Observer :: notify的调用率也很高,但是其中大多数将被我未在此处发布的代码过滤掉,并且Emit调用非常少见。 如果有人可以帮助我指出为什么未激活该插槽,我将非常感激。 它几乎就像MyWidget类实例没有处理其事件循环一样。 我将连接类型设置为直接连接取得了一些成功,但是由于发出是在一个单独的线程中,并且插槽的生产代码将更新UI,所以我排除了这作为最终解决方案。

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();
}

杰里米(Jeremy)在对我的问题的评论中添加的链接中引用了此链接,但仅为了说明:

解决方案是添加:

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

在通话之前立即连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM