Domanda

Ok, quindi stasera ho questo problema:

[...]   

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

Sto cercando di interrompere in qualsiasi momento la procedura calcola (), ma subito dopo l'avvio perdo il controllo e non riesco a premere STOP. Naturalmente nei miei piani futuri calcola () sta per "calcolare" qualcosa di reale (ad es. simulazione del trasferimento di calore).

Grazie per i suggerimenti. P.

È stato utile?

Soluzione

Dovresti esaminare il threading. Il calcolo blocca l'interfaccia utente.

Altri suggerimenti

Bene, in "Introduzione ai modelli di progettazione in C ++ con Qt4" dicono quello

  

" è possibile evitare l'uso di   discussioni a favore del Qt Event Loop   combinato con QTimer "

ma non l'ho mai provato :)

In realtà, ho appena provato -

add:

QTimer      *Timer;

nell'intestazione della classe MainWindow e nel costruttore MainWindow aggiungere:

Timer = new QTimer(this);

quindi cambia calcoli () dalla funzione a un segnale e modifica:

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

Questo dovrebbe funzionare fintanto che non passi alcun argomento in calcoli ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top