Как правильно пересылать обновления QProgressBar через классы на логическом уровне?

Я использую QProgressBar и уже выяснили, как отправить прогресс из определенного класса на логическом уровне с помощью этой процедуры:

  • настройка соединения в классе уровня представления.
  • создание сигнала в классе логического уровня.
  • изменение класса логического уровня таким образом, чтобы он был объектом QObject.
  • вызов QObject в качестве конструктора класса базового класса для логического уровня.

Теперь я хотел бы, чтобы мой конкретный класс в логическом слое отправлял прогресс через другой класс.

Например:

  1. Класс A (в уровне представления): создайте соединение для прогресса в классе B.
  2. Класс B (на уровне логики): создайте соединение для прогресса в классе C.
  3. Класс C: обновление прогресса, чтобы его можно было увидеть в классе A (view-layer).

Я пытался подражать эта процедура для использования соединения и сигнала от класса B до C, но это, кажется, не работает.

Любой ответ будет оценен

1

Решение

Я бы создал промежуточный уровень между уровнем логики и уровнем пользовательского интерфейса, называемый уровнем обслуживания, и я бы добавил интерфейсные классы для соединения двух уровней. Основой этого сервисного уровня было бы принимать сообщения от пользовательского интерфейса и знать, чего ожидать от логического уровня. Затем ваш сервисный уровень отправит сообщение на логический уровень. Затем он может создать виртуальные реализации классов, которые вы ожидаете от логического уровня. Заполните бетонную оболочку и передайте их обратно в слой пользовательского интерфейса. Это может быть немного запутанным, но это потому, что это так. Это большая тема, называемая n-уровневым приложением или множеством других имен, но действительно хорошая книга по шаблонам проектирования, вероятно, будет полезна при работе над проектом, требующим интерфейсов в c ++, но вы всегда можете абстрагировать идеи с помощью шаблон дизайна, применяемый на другом языке, таком как c #. Надеюсь, это немного помогло, извините, это не то, что вы можете просто набрать и увидеть, но получить хорошее представление о том, что вы пытаетесь сделать, я считаю, было бы гораздо выгоднее, чем просто работать с проблемой временного механизма слота сигнала. Если вы предоставите больше кода, я смогу диагностировать вашу текущую ситуацию.

1

Другие решения

Вы можете использовать соединение SIGNAL / SIGNAL для пересылки сигналов с совместимыми подписями. В приведенном ниже примере кода важной частью является соединение в конструкторе LogicClass1.

// My other logic class
class LogicClass1 : public QObject
{   Q_OBJECT
public:
LogicClass1(LogicClass2* lc2)
: lc2(lc2)
{
connect(lc2, SIGNAL(signalPrograssIteration(int)),
this, SIGNAL(signalPrograssIteration(int)));
}

signals:
void signalPrograssIteration(int);

private:
LogicClass2 *lc2;
};

// My other logic class
class LogicClass2 : public QObject
{   Q_OBJECT
public:
LogicClass2(){}

signals:
void signalPrograssIteration(int);

private:
void doSomething();
};

// the function that actually does stuff
void LogicClass2::doSomthing()
{
int val = 0;
for(...)
{
.
.
emit signalPrograssIteration(val);
.
.
}
}

Вы можете увидеть аналогичный пример в документации для QObject :: подключить.

1

ОК, я понял это.
Что я сделал, так это отправил объект peogress-bar из MainWindow (слой представления) в LogicClass1 (слой логики)
а затем подключить его с СИГНАЛ LogicClass2,

Конечно, LogicClass1 должен наследовать от QObject, как указано выше

class LogicClass1 : public QObject
{

Q_OBJECT
.
.
.

И самое главное (потому что я забыл об этом): щелкните правой кнопкой мыши на проекте и «Запустите qmake» 🙂

1
По вопросам рекламы [email protected]