Запуск и остановка Qt4 (пауза)
Вопрос
Хорошо, сегодня вечером у меня возникла такая проблема:
[...]
connect(startButton, SIGNAL(clicked()), this, SLOT(startCalculation()));
connect(stopButton, SIGNAL(clicked()), this, SLOT(stopCalculation()));
[...]
void MainWindow::startCalculation()
{
qDebug() << "hello";
this->startButton->setDisabled(true);
this->stopButton->setEnabled(true);
this->calcStatus = true;
this->calculate();
}
void MainWindow::stopCalculation()
{
this->startButton->setEnabled(true);
this->stopButton->setDisabled(true);
this->calcStatus = false;
}
void MainWindow::calculate()
{
qDebug() << "hello";
while(this->calcStatus)
{
}
}
[...]
Я пытаюсь сделать так, чтобы процедуру вычисления() можно было остановить в любой момент, но сразу после ее запуска я теряю контроль и не могу нажать СТОП.Конечно, в моих планах на будущее, метод метода Calculation() будет «вычислять» что-то реальное (например,моделирование теплопередачи).
Спасибо за предложения.П.
Решение
Вам нужно было бы изучить потоки. Расчет блокирует пользовательский интерфейс.
Другие советы
Ну, во «Введении в шаблоны проектирования на C++ с помощью Qt4» они говорят, что
«Можно избежать использования потоков в пользу цикла событий QT в сочетании с Qtimers»
но я никогда не пробовал :)
Вообще-то, я только что попробовал...
добавлять:
QTimer *Timer;
в заголовке класса MainWindow и в конструкторе MainWindow добавьте:
Timer = new QTimer(this);
затем измените функцию Calculate() на сигнал и измените:
void MainWindow::startCalculation()
{
qDebug() << "hello";
this->startButton->setDisabled(true);
this->stopButton->setEnabled(true);
this->calcStatus = true;
connect(Timer, SIGNAL(timeout()), this, SLOT(calculate()));
Timer->start(0);
}
void MainWindow::stopCalculation()
{
this->startButton->setEnabled(true);
this->stopButton->setDisabled(true);
this->calcStatus = false;
Timer->stop();
Timer->disconnect(this,SLOT(calculate()));
}
Это должно работать, пока вы не передаете какие-либо аргументы в метод расчета().