不同类别的 2 个对象之间的信号/插槽

Posted

技术标签:

【中文标题】不同类别的 2 个对象之间的信号/插槽【英文标题】:Signal/slot between 2 objects of different classes 【发布时间】:2017-04-03 09:22:43 【问题描述】:

我有一个关于 Signal-Slots 的问题:

我有一个文件userinterface.cpp,其中有 2 个类 MoveSeriesChart 的 2 个对象:

MoveSeries * MOVE_SERIES  ;
MOVE_SERIES = new MoveSeries( this);

Chart * CHART  ;
CHART  = new Chart ( this);

在我的userinterface.cpp 中,我有ui.Diagramm 作为Chart 类型的对象。

现在我想让ChartMoveSeries 通信。我可以使用userinterface.cpp 中的直接信号槽来做到这一点吗?类似的东西

 Userinterface.cpp:
   .
   .
   .
    connect(   ui.Diagram   , SIGNAL( send_BarValue( double val   )),
               MOVE_SERIES  , SLOT( on_BarValueReceived (double val) )) ;

   ...

或者我只能在MoveSeries UserinterfaceChart Userinterface 之间有信号槽吗?

谢谢!

【问题讨论】:

你试过你的解决方案了吗?如果是这样,您知道答案(是的,您可以这样做) 是的,我试过了,但是没用,所以这是我的第一个想法。现在我知道它可以工作了,看来我的参数有问题非常感谢! 是的,你可以。你甚至可以做信号到信号的连接。它对你不起作用?你能告诉我们你的代码吗?你确定 MOVE_SERIES 继承自 QObject 并定义了这个插槽吗? (对于 ui 表单,它是否定义了信号?) 尝试使用搜索框,甚至更好——阅读文档。 还要确保所有带有信号和插槽的类都具有Q_OBJECT 宏,否则将无法连接。通常连接问题(不是现有的slot等)在运行时会记录到控制台,你也可以看看。 【参考方案1】:

您的解决方案有效,但它的编写方式错误,您不能在 connect SIGNAL 或 SLOT 调用中传递值,只能传递类型。

 connect(ui.Diagram   , SIGNAL( send_BarValue(double)),
           MOVE_SERIES    ,SLOT( on_BarValueReceived (double) )) ;

但这也很糟糕,这是 Qt4 风格的连接,它可以编译和运行,但是如果你在那里输入错误的任何内容,你不会在构建时间得到错误。

更喜欢使用新的 Signal / Slot 语法:

 connect(   ui.Diagram   , &DiagramClass::end_BarValue,
           MOVE_SERIES    ,&MOVE_SERIESClass::on_BarValueReceived) ;

这样连接将在编译时进行检查,从而减少您可能遇到的问题。

【讨论】:

以上是关于不同类别的 2 个对象之间的信号/插槽的主要内容,如果未能解决你的问题,请参考以下文章

Keras LSTM 网络预测所有信号属于同一类别(在 3 个不同的类别中)

Python pandas:如何在 2 个不同类别之间更改分类值

Qt 4.8:来自不同线程的两个信号和一个插槽之间的连接行为

如何将信号连接到 2 个共享库之间的插槽

在 QObject 之间跨不同线程连接信号/插槽

如何将数据分为 3 个不同的类别