Как вызвать обычную функцию из exec()?

У меня есть 2 класса: один поддерживает некоторый цикл (по крайней мере, в течение 2-3 минут и унаследован от QObject), а другой отображает диалоговое окно прогресса (унаследовано от QDialog). Я хочу запустить цикл, как только появится диалоговое окно. Мое первое решение было:

 int DialogClass::exec()
 {
     QTimer::singleShot(0, LoopClassPointer, SLOT(start()));
     return __super::exec();
 }

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

int DialogClass::exec()
{
     LoopClassPointer->start();
     QApplication::processEvents();
     return __super::exec();
}

не помогай. Диалог не появляется. Есть ли общий подход к такого рода ситуациям?

некоторые детали, согласно вопросам:

  1. Мне приходится работать с системой со своими стилями, поэтому у нас общий подход в создании любых диалогов: наследовать их от класса стилей, который наследуется от QDialog.

  2. мой 'LoopClassPointer' - это экспортированный класс из отдельной dll (в нем нет поддержки пользовательского интерфейса).

  3. У меня есть кнопка «Пуск» в основном приложении, которая связана со слотом, который создает диалоговое окно прогресса и «LoopClassPointer». на данный момент я отправляю экземпляр LoopClassPointer в диалоговом окне и не хочу вносить существенные изменения в архитектуру.


person Illia Levandovskyi    schedule 16.12.2013    source источник
comment
Что означает __супер? Вы пытаетесь получить доступ к объекту, созданному и зарезервированному компилятором?   -  person Valentin Heinitz    schedule 16.12.2013
comment
Разве не должно быть наоборот? Диалоговое окно «Прогресс» должно отображаться сразу после запуска процесса?   -  person Valentin Heinitz    schedule 16.12.2013
comment
Все ли эти объекты работают в одном потоке? В вашем коде непонятно, что вы пытаетесь сделать. Способ связи между различными объектами заключается в подключении сигнала к слоту. Таким образом, вы должны подключить некоторый сигнал obj1 к слоту в obj2 и излучать сигнал от obj1, когда он запускается ... это то, что вы пытаетесь сделать?   -  person code_fodder    schedule 16.12.2013


Ответы (2)


Взгляните на функцию QtDemo-> Параллельное программирование-> Выполнить.

например в Qt 4.8: http://qt-project.org/doc/qt-4.8/qtconcurrent-runfunction.html

person Valentin Heinitz    schedule 16.12.2013

В этой ситуации я рекомендую вам отделить логику цикла от диалога. Элементы графического интерфейса всегда должны храниться отдельно.

Замечательно, что ваш рабочий класс является производным от QObject, потому что это означает, что вы можете запустить его в отдельном потоке:

QThread* m_pWorkerThread = new QThread;
Worker* m_pWorkerObject  = new Worker; // assuming this object runs the loop mentioned

// Qt 5 connect syntax
connect(m_pWorkerThread, &QThread::started, m_pWorkerObject, &WorkerObject::start);
connect(m_pWorkerThread, &QThread::finished, m_pWorkerThread, &QThread::deleteThis);

m_pWorkerObject->moveToThread(m_pWorkerThread);
m_pWorkerThread->start();

Если вы не знакомы с использованием QThread, начните с чтения это.

Единственное, что вам нужно, это периодически отправлять сигналы от вашего рабочего объекта с ходом его работы и подключать его к слоту в диалоговом окне, которое обновляет его отображение прогресса.

person TheDarkKnight    schedule 16.12.2013