c++ - 可以多次链接信号和插槽吗?

标签 c++ multithreading qt signals

我有类似以下类的设计,我想知道我是否可以使用许多信号槽连接在它们之间进行通信。有一个包含所有 GUI 的 MainWindow 类,然后是一个为后端提供接口(interface)的 Wrapper 类,然后是一个 Controller 类用于生成和管理线程,最后还有 Worker 来完成所有工作。

现在假设我正在加载一个文件并想在 MainWindow 中使用进度条显示进度。我的 Worker 类将 updateProgress(int progress) 发送到 Controller::handleProgress(int progress) 槽,它再次将进度信号发送到 Wrapper 类,它反过来向主窗口发送进度信号,最终更新进度条。

类似地,当数据加载后,它在 Wrapper 类中进行处理,并再次通过信号和槽进行通信(尽管少了一个步骤)。

这是在 Qt 中做事的标准方式还是我应该重新考虑我的设计?

最佳答案

这是一个有效的可能性。

请注意,Qt 允许您更进一步并执行以下操作:

QObject::connect(&sender, SIGNAL(mySenderSignal(int)),
                 &receiver, SIGNAL(myReceiverSignal(int));

没错,你可以将一个信号绑定(bind)到一个信号上。它所做的一切可以看作是“当发出发送者的信号时,发出接收者的信号”。

如果您在中间槽中没有任何特定任务要执行,这可能会为您节省几行,同时准确显示您在做什么:您正在“转发”信号。否则,如果您绝对必须在两者之间进行工作,那么您必须保留信号和槽。

请注意,您仍然必须确保信号签名匹配。

关于c++ - 可以多次链接信号和插槽吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23426860/

相关文章:

c++ - 如何使用x11窗口背景加载bmp文件

c++ - 具有自定义类的 Vector 的 vector

java - ScheduledExecutorService 一线程多任务

c# - 即使在 UI 线程上执行时也可以跨线程操作

android - 为 ARM 和 x86 构建 Qt

c++ - QTime->addSecs 导致段错误

c++从文本文件中读取数字,忽略注释

c++ - 使用 SFINAE 进行结构定义

c - 如何在 C 语言中使用线程创建一个简单的程序?

qt - 如何从 QGraphicsItem::paint() 中将 QGLFrameBufferObject 绘制到画家上