Qt 库设计与信号

Qt library design with signals

我正在尝试设计一个 Qt 库,它使用信号将输出返回给客户端代码,但我无法完全理解它,我认为出了点问题。

假设库公开了一个 class A 如下:

class A {
public:
    void request(int data);
signals:
    void response(int res);
}

因此客户端代码实例化了一个 A,将其信号连接到一个插槽,并调用 request()。我最初选择对 return 输出使用信号,因为 A 需要一些时间来详细说明响应,所以我希望该调用是非阻塞的。

我的问题是:如果我需要在我的代码中的许多不同地方调用 request(),并在收到响应后做不同的事情怎么办?我认为问题根本在于正确使用 Qt 的 signal/slot 设计。

举一个具体的例子,并希望进一步解释我自己,我暂时解决了在 request() 之前设置一个布尔值的问题 "remind" 我以后要采取什么执行路径:

void doingThis() {
    doingThis = true;
    request(data);
}

...

void doingThat() {
    doingThis = false;
    request(data);
}

...

public mySlot(int res) {
    if (dointThis) {
        ...
    } else {
        ...
    }
}

这太可怕了。我做错了什么?

我同意 Ludo 对你的问题发表的评论。

如果您将一些随机数(标识符)传递到请求中,那么 A 可以将相同的随机数与响应信号一起发回。即使您有一堆插槽连接到该信号,您也可以让它们只处理熟悉标识符的信号。

class A {
public:
    void request(int data, int id);
signals:
    void response(int res, int id);
}

void doingThis() {
    request(data, 0xaaaa);
}

...

void doingThat() {
    request(data, 0xbbbb);
}

...

public mySlotA(int res, int id) {
    if (id == 0xaaaa) {
        ...
    } 
}

public mySlotB(int res, int id) {
    if (id == 0xbbbb) {
        ...
    }
}

在上面的例子中,id 被硬编码来表示调用的来源。但是,您也可以随机生成 ID。如果这样做,则需要保存随机生成的 ID。优点是您可以从 doingThis() 发送多个不同的请求,并且能够在每个请求返回您的插槽时了解哪个响应属于每个请求。