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()
发送多个不同的请求,并且能够在每个请求返回您的插槽时了解哪个响应属于每个请求。
我正在尝试设计一个 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()
发送多个不同的请求,并且能够在每个请求返回您的插槽时了解哪个响应属于每个请求。