问题标签 [signals-slots]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
727 浏览

qt4 - 槽函数没有被调用

我正在学习 QT 并尝试一些示例。

我正在尝试制作一个对话框,该对话框在按下按钮时会消失标签,并在再次按下相同按钮时使其出现。

下面是代码。

它不工作。每当我按下测试按钮时,什么都没有发生。但是,如果我更改信号槽连接,因为 QObject::connect(testButton, SIGNAL(clicked(bool)), testLabel, SLOT(setVisible(bool)));它会使标签消失。

那么,为什么它不适用于“切换”信号。我猜是,它无法找到那个信号。各位大神能不能放个光?

0 投票
1 回答
1039 浏览

c++ - C++ Signals/Slot:插槽处理和最佳 C++ 信号库?

我目前有一个程序,它使用繁忙的池和一堆线程来监视对象的状态、处理数据和传递数据。这一切都很难管理/浪费 cpu 时间。我正在考虑删除线程并使用信号/插槽,因为我的代码都没有“阻塞”。

所以我会用信号表示我的对象的状态,这很容易。更难的是我还想使用插槽来信号数据,并传递数据。

基本上: A->SignalIHAVEDATA(B.slot() and C.slot()) B 和 C 可能无法处理数据。所以我应该在 B 和 C 中保留一个标志,告诉他们它们是数据。或者我应该每隔 X 毫秒重新发出一次信号,直到数据被采集。

还..

假设 B 接受数据。在 B.Slot 内部,它需要 handleToA->getData(); 是否有意义?&& 处理数据?&& 信号另一件事。

如果我发出 signalA 并在 slotA 内发出一个 signalB 会在 slotA 返回之前处理 slotB 吗?(如果这条链很长,那么 slotA 返回可能需要一段时间?)

感谢您的帮助:)

0 投票
3 回答
8661 浏览

c++ - 没有依赖关系的最快的 C++ 信号/插槽库

我将使用信号和槽将数据向上/向下传递一个 5-10 层对象。这应该会导致每秒几千个信号。这是“我点击了一个按钮”的形式。我所有的对象也会在大约每 100 毫秒的计时器上向他们发出自我信号,以便他们可以进行一些处理。

什么是最快的 C++ Signal/Slot 实现,它很小并且不需要其他库,例如 boost。(我需要保持二进制文件的总大小非常小)。

我见过 libSigC++、sigSlot、Cpp-Events、

0 投票
1 回答
314 浏览

c++ - C++ 管理共享对象的句柄问题

是否有管理由 2 个或多个其他对象共享的对象的最佳实践。即使在不同的线程上运行?

例如,创建了 A,并将指向它的指针分配给 B 和 C。 ObjA A = new ObjA(); B->GiveObj(A); C->GiveObj(A);

现在我怎样才能删除 objA?

到目前为止,我所关心的是 A 监控它有多少 ref 并且当这个计数器为 0 时它会删除它(例如当 A 被传递时,接收器调用 A->Aquire(),当它完成时它调用 A- >释放();

或者我可以告诉 B->RemoveObj(A); 和 C->RemoveObj(A); 问题是如果 B 或 C 在不同的线程上运行,我无法删除 A,直到他们完成 A,并且他们已经看到了 RemoveObj 调用。(这需要一堆凌乱的标志)。

是否有一种很好的方法可以做到这一点,可能使用信号/插槽?

谢谢

0 投票
1 回答
1872 浏览

qt - Qt - 信号槽中的参数

我有一个 QPushButton、QDateEdit 和另一个自定义对象。我想将按钮连接到日期编辑对象,当我单击按钮时,日期编辑对象会将其设置日期更改为自定义对象上定义的日期。有点像这样:

但我不能那样做。显然,connect 语句没有指定从信号传递到插槽的信息是什么,只指定传递的信息的类型。有没有办法做到这一点而不必创建一个新类?

0 投票
4 回答
1329 浏览

c++ - 具有子类特定模板化参数类型的 Qt SIGNAL 架构

我正在使用 Qt 开发一个科学数据采集应用程序。由于我不是 Qt 方面的资深专家,因此我希望社区就以下问题提供一些架构建议:

该应用程序支持多个硬件采集接口,但我想在这些接口之上提供一个通用 API。每个接口都有一个样本数据类型和一个数据单位。因此,我将来自每个设备的样本向量表示为std::vectorBoost.Units 数量(即std::vector<boost::units::quantity<unit,sample_type> >)。我想使用多播风格的架构,其中每个数据源将新收到的数据广播给 1 个或多个感兴趣的各方。Qt 的 Signal/Slot 机制显然很适合这种风格。所以,我希望每个数据源都发出一个信号

适用于该设备的单元和 sample_type。由于元对象编译器不支持模板化子QObject类,因此似乎没有办法为定义samplesAcquired信号的所有数据源提供(模板化)基类。换句话说,以下内容不起作用

我能想到的最佳选择是两层方法:

samplesAcquired信号现在为采集提供时间戳和样本数量,客户端必须使用IAcquiredSamplesAPI 来检索这些样本。显然,数据源必须同时继承 DataSource 和IAcquiredSamples.

这种方法的缺点似乎是失去了 API 的简单性……如果客户端可以连接 Slot 中获取的样本,那就更好了。能够使用 Qt 的排队连接也将使线程问题更容易,而不必acquiredData在每个子类的方法中管理它们。

另一种可能性是使用QVariant参数。这必然使子类有责任用Q_REGISTER_METATYPE/注册其特定的样本向量类型qRegisterMetaType。没什么大不了的。然而,基类的客户端将无法知道QVariant值类型是什么类型,除非标记结构也与信号一起传递。我认为这个解决方案至少和上面的一样复杂,因为它迫使抽象基类 API 的客户端处理类型系统的一些更复杂的方面。

那么,有没有办法实现模板化的信号参数呢?有没有比我建议的架构更好的架构?

0 投票
3 回答
1050 浏览

c++ - 暴露所包含小部件的信号/插槽的正确 Qt 习惯用法是什么?

假设我有一个MyWidget包含一个MySubWidget,例如一个包含文本字段或其他内容的自定义小部件。我希望其他类能够连接到包含的MySubWidget实例公开的信号和插槽。是执行此操作的常规方法:

  1. 通过方法暴露一个指向MySubWidget实例的指针subWidget()MyWidget
  2. 复制类中的信号和槽MySubWidgetMyWidget编写“转发”代码
  3. 还有什么?

选择 1 似乎是最少的代码,但它也打破了封装,因为现在其他类知道包含的小部件是什么,MyWidget并且可能依赖于它们的功能。

选择 2 看起来像是保持封装,但它有很多看似冗余且可能令人费解的代码,这会破坏整个信号和插槽系统的优雅。

在这种情况下通常会怎么做?

0 投票
1 回答
9480 浏览

qt - Qt - 调用小部件父的插槽

我编写了一个小程序来测试访问小部件父级插槽。基本上,它有两个类:

小部件:

和自定义小部件:

在主函数中,我简单地创建了一个 Widget 实例,并在其上调用了 show()。这个 Widget 实例有一个标签、一个 QString、一个 customWidget 类的实例和两个按钮(在 ui 类中,pushButton 和 pb)。其中一个按钮在其自己的类中调用一个名为 changeLabel() 的槽,顾名思义,它将标签更改为其中包含的 QString 中设置的任何内容。我这样做只是为了检查 changeLabel() 是否有效。这个按钮工作正常。另一个按钮调用 customWidget 实例中的一个名为 callParentSlot() 的槽,该槽依次尝试调用其父级中的 changeLabel() 槽。因为在这种情况下,我知道它的父级实际上是 Widget 的一个实例,所以我将 parentWidget() 的返回值转换为 Widget*。此按钮使程序崩溃。我在 customWidget 中制作了一个按钮来尝试调用 customWidget' s 父插槽也是如此,但它也会使程序崩溃。我关注了正在发生的事情这个问题。我错过了什么?

0 投票
2 回答
10702 浏览

qt - Qt - 没有这样的信号错误

我试图在冰箱磁铁示例上的一个可拖动小部件中发生双击时触发信号。这是我对示例源所做的更改:

拖动标签:

我在实现文件中唯一更改的是添加connect(this,SIGNAL(testSignal()),this,SLOT(testSlot()));到 DragLabel 的构造函数中。

尝试编译该项目导致“未定义对 `DragLabel::testSignal() 的引用”和“ collect2: ld returned 1 exit status ”错误。

当我注释掉对信号的调用时,它会编译并运行,但会在应用程序输出中发出“ Object::connect: No such signal QLabel::testSignal() in draglabel.cpp ”警告。显然 testSignal() 没有被识别为信号。

我尝试将 Q_OBJECT 宏添加到 DragLabel 但它导致 4 ' undefined reference to `vtable for DragLabel' ' 警告和 ' collect2: ld returned 1 exit status ' 错误。

我错过了什么?

0 投票
1 回答
1171 浏览

python - 正确使用 PyQt 信号

不久前,我在 Qt for C++ 中做了一些工作;现在我正在使用 PyQt。

我有一个 QStackedWidget 的子类,里面有一个 QWidget 的子类。在 QWidget 中,我想单击一个按钮转到 QStackedWidget 的下一页。我的(简化)方法如下:

所以,基本上,我将 continueButtonclicked信号连接到 EventsPagenextPage信号,然后我在 Stacked 中将其连接到nextPage方法。我可以在 Stacked 和 connect 中深入研究 EventsPage 的内部结构self.widget1.continueButton.clicked,但这似乎完全违背了信号和插槽的目的。

那么这种方法有意义吗,还是有更好的方法?