Как правильно пересылать обновления QProgressBar через классы на логическом уровне?
Я использую QProgressBar и уже выяснил, как отправить прогресс из определенного класса в логическом слое с помощью этой процедуры:
- настройка соединения в классе уровня представления.
- создание сигнала в классе логического уровня.
- изменение класса логического уровня таким образом, чтобы он был объектом QObject.
- вызов QObject в качестве конструктора класса базового класса для логического уровня.
Теперь я хотел бы, чтобы мой конкретный класс на уровне логики отправлял прогресс через другой класс.
Например:
- Класс A (в уровне представления): создайте соединение для прогресса в классе B.
- Класс B (на уровне логики): создайте соединение для прогресса в классе C.
- Класс 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.