Question

Ok, alors j'ai ce problème ce soir:

[...]   

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)
   {
   }
}
[...]

J'essaie de rendre la procédure de calcul () arrêtable à tout moment, mais juste après son démarrage, je perds le contrôle et je ne peux pas appuyer sur STOP. Bien sûr, dans mes projets futurs, calcule () va "calculer". quelque chose de réel (simulation de transfert de chaleur, par exemple).

Merci pour vos suggestions. P.

Était-ce utile?

La solution

Vous devez vous pencher sur le filetage. Le calcul verrouille l'interface utilisateur.

Autres conseils

Eh bien, dans "Introduction aux modèles de conception en C ++ avec Qt4" ils disent que

  

"il est possible d'éviter l'utilisation de   discussions en faveur de la boucle d'événement Qt   combiné avec QTimers "

mais je ne l'ai jamais essayé :)

En fait, je viens d'essayer -

ajouter:

QTimer      *Timer;

dans l'en-tête de classe MainWindow et dans le constructeur MainWindow, ajoutez:

Timer = new QTimer(this);

puis changez la fonction calcule () de fonction en signal et modifiez:

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()));
} 

Ceci devrait fonctionner aussi longtemps que vous ne transmettez pas d'arguments à calcule ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top