gpt4 book ai didi

c++ - 多次调用更新时 Qt 应用程序崩溃

转载 作者:行者123 更新时间:2023-11-28 02:27:42 25 4
gpt4 key购买 nike

我有一个可以使用 QPainter 绘制分形的应用程序。paintEvent 函数如下:

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_isFinished 为真),但在开始一秒钟后,它会崩溃。drawFractal 函数仅根据另一个名为 computeFractal 的函数的连续计算结果绘制分形,该函数在另一个线程中运行。 m_isFinished bool 变量在此函数开始时设置为 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 在这种情况下根本不会被调用。

最佳答案

编辑:update() 实际上安排了一个paintEvent(),这意味着它不会导致无限递归。只有 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() 上你应该只留下实际的渲染。

编辑:Qt 有其他控制时间的解决方案,可以帮助您渲染,例如QElapsedTimer

关于c++ - 多次调用更新时 Qt 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29974992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com