0

を使用してフラクタルを描画できるアプリケーションがありますQPainterpaintEvent機能は次のとおりです。

void SimulationWindow::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QPen my_pen;
    initPainter(painter,my_pen);
    initCoordsystem(painter);
    if(m_mode == TRACE)
    {
        drawTrajectory(painter,my_pen);
    }
    else if(m_mode == FRACTAL)
    {
        drawFractal(painter, my_pen);
    }

    /*if(!m_isFinished)
    {
        update();
    }*/
}

if最後の部分がコメントアウトされているこのバージョンでは、問題なく動作するようです。そうしないと、実行中 ( m_isFinishedtrue になるまで) フラクタルを継続的に描画し始めますが、開始から 1 秒後にクラッシュします。このdrawFractal関数は、別のスレッドで実行されている computeFractal と呼ばれる別の関数によって継続的に計算された結果に基づいて、フラクタルの描画のみを行います。ブール変数は、このm_isFinished関数の開始時に false に設定され、最後に true に設定されます。

私はこれについて本当に混乱しています。誰かがクラッシュの原因を教えてもらえますか? おそらくcomputeFractalが別のスレッドで実行されているためでしょうか? ( QtConcurrent::run(this -> m_simulationwindow, &SimulationWindow::computeFractal);)

編集:

void SimulationWindow::drawFractal(QPainter &painter, QPen &my_pen)
{
   for(int i = 0; i < m_colors.size(); ++i)
   {
       if(m_colors[i] == 0)
       {
           my_pen.setColor(Qt::red);
           painter.setPen(my_pen);
           painter.drawPoint(m_positions[i]);
       }

       else if(m_colors[i] == 1)
       {
           my_pen.setColor(Qt::green);
           painter.setPen(my_pen);
           painter.drawPoint(m_positions[i]);
       }

       else if(m_colors[i] == 2)
       {
           my_pen.setColor(Qt::blue);
           painter.setPen(my_pen);
           painter.drawPoint(m_positions[i]);
       }
   }
}

drawTrajectoryこの場合、まったく呼び出されません。

4

1 に答える 1

2

編集:update()実際にはスケジュールは apaintEvent()です。つまり、無限再帰は発生しません。repaint()それを引き起こすだけです。

提案:

毎秒呼び出しが更新されるように設定し、QTimerこの方法でレンダリングの実行/フレームレートを制御できます。

QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout(), this, SLOT(myUpdate()));
timer->start(1000f/60f);  //every 1/60 of a second it times out

void MyWindow::myUpdate()
{ 
    //do your logic here
    update();
}

そしてpaintEvent()、実際のレンダリングだけを残す必要があります。

EDIT:Qtには、時間を制御するための他のソリューションがあり、QElapsedTimerなどのレンダリングに役立ちます

于 2015-04-30T18:33:49.917 に答える