Я использую QProgressBar и уже выяснили, как отправить прогресс из определенного класса на логическом уровне с помощью этой процедуры:
Теперь я хотел бы, чтобы мой конкретный класс в логическом слое отправлял прогресс через другой класс.
Например:
Я пытался подражать эта процедура для использования соединения и сигнала от класса B до C, но это, кажется, не работает.
Любой ответ будет оценен
Я бы создал промежуточный уровень между уровнем логики и уровнем пользовательского интерфейса, называемый уровнем обслуживания, и я бы добавил интерфейсные классы для соединения двух уровней. Основой этого сервисного уровня было бы принимать сообщения от пользовательского интерфейса и знать, чего ожидать от логического уровня. Затем ваш сервисный уровень отправит сообщение на логический уровень. Затем он может создать виртуальные реализации классов, которые вы ожидаете от логического уровня. Заполните бетонную оболочку и передайте их обратно в слой пользовательского интерфейса. Это может быть немного запутанным, но это потому, что это так. Это большая тема, называемая 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 :: подключить.
ОК, я понял это.
Что я сделал, так это отправил объект peogress-bar из MainWindow (слой представления) в LogicClass1 (слой логики)
а затем подключить его с СИГНАЛ LogicClass2
,
Конечно, LogicClass1
должен наследовать от QObject, как указано выше
class LogicClass1 : public QObject
{
Q_OBJECT
.
.
.
И самое главное (потому что я забыл об этом): щелкните правой кнопкой мыши на проекте и «Запустите qmake» 🙂