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

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

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

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

Например:

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

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

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

3 ответа

Решение

ОК, я понял это. Я отправил объект peogress-bar из MainWindow (уровень представления) в LogicClass1 (уровень логики) и затем подключил его к SIGNAL для LogicClass2,

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

class LogicClass1 : public QObject
{

    Q_OBJECT
   .
   .
   .

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

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

Вы можете использовать соединение 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:: connect.

Другие вопросы по тегам