سؤال

وطيب، ولذا فإنني أواجه هذه المشكلة الليلة:

[...]   

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

وأنا أحاول أن جعل هذا الإجراء حساب () أيقافه في أي وقت، ولكن مباشرة بعد بدء تشغيله I تحكم فضفاضة، وأنا لا يمكن أن تضغط إيقاف. بالطبع في حساب خططي المستقبلية () يتم الانتقال إلى "حساب" شيء حقيقي (على سبيل المثال نقل الحرارة المحاكاة).

وشكرا لاقتراحات. P.

هل كانت مفيدة؟

المحلول

وأنت في حاجة للنظر في خيوط. حساب بتأمين واجهة المستخدم.

نصائح أخرى

حسنا، في "مقدمة في تصميم أنماط في C ++ مع QT4" يقولون أن

<اقتباس فقرة>   

و"أنه من الممكن تجنب استخدام   المواضيع في صالح كيو تي حلقة الحدث   جنبا إلى جنب مع QTimers "

ولكن لقد حاولت ذلك أبدا:)

في الواقع، لقد حاولت فقط -

وإضافة:

QTimer      *Timer;

وفي الرأس فئة MainWindow وفي MainWindow منشئ إضافة:

Timer = new QTimer(this);

وبعد ذلك تغيير حساب () من وظيفة إلى إشارة وتعديل:

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

وهذا يجب أن تعمل طالما كنت لا يمر أي حجج إلى حساب ().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top