Дизайн библиотеки Qt с сигналами - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь спроектировать библиотеку Qt, которая возвращает выходные данные клиентскому коду с помощью сигналов, но я не могу полностью разобраться с этим, я думаю, что-то не так.

Скажите, библиотекапредоставляет один класс A следующим образом:

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

Таким образом, клиентский код создает экземпляр A, подключает свой сигнал к слоту и вызывает request ().Сначала я решил использовать сигнал для возврата выходных данных, потому что для разработки ответа А требуется некоторое время, поэтому я хочу, чтобы этот вызов был неблокирующим.

Моя проблема: что, если мне нужно позвонить request() в разных местах моего кода, и делаю ли я разные вещи после получения ответа?Я думаю, что вопрос в корне заключается в правильном использовании дизайна сигнала / слота Qt.

Чтобы привести конкретный пример и, надеюсь, объяснить себя дальше, я временно решил проблему установки логического значения до request() дляНапомните мне, какой путь казни выбрать позже:

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

...

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

...

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

Это отвратительно.Что я делаю не так?

1 Ответ

0 голосов
/ 11 октября 2018

Я согласен с Людо, который прокомментировал ваш вопрос.

Если вы передадите в запрос какое-то случайное число (идентификатор), то А сможет передать это же случайное число обратно с ответным сигналом.Даже если у вас есть несколько слотов, подключенных к этому сигналу, вы бы заставили их обрабатывать сигнал, только если идентификатор был им знаком.

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) {
        ...
    }
}

В вышеприведенном случае идентификатор жестко запрограммирован для представления источника вызова.Тем не менее, вы также можете случайно генерировать идентификатор.Если вы это сделали, то вам нужно сохранить случайно сгенерированный идентификатор.Преимущество заключается в том, что вы можете отправлять несколько разных запросов из doingThis() и понимать, какой ответ принадлежит каждому запросу, когда они возвращаются в ваш слот.

...