Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt setTransformOriginPoint带来高CPU使用率_Qt_Paint_Cpu Usage_Qt4.7 - Fatal编程技术网

Qt setTransformOriginPoint带来高CPU使用率

Qt setTransformOriginPoint带来高CPU使用率,qt,paint,cpu-usage,qt4.7,Qt,Paint,Cpu Usage,Qt4.7,我发现我在自定义GraphicsItem中的绘制函数占用了100%的CPU(在最坏的情况下) 我发现是这样的: 设定原点 在所有其他功能中(drawRect、set High Quality antialias等) 有趣的是我把它拿走了,一切都很好。我把它放在平移之后,所以假设它会相对于新的变换原点旋转。但不管怎样,它还是奏效了。。。我想知道为什么 但主要问题是:为什么100% 我为您提供了高cpu使用率项目的油漆代码: // Translate all to the center of the

我发现我在自定义GraphicsItem中的绘制函数占用了100%的CPU(在最坏的情况下)

我发现是这样的: 设定原点

在所有其他功能中(drawRect、set High Quality antialias等)

有趣的是我把它拿走了,一切都很好。我把它放在平移之后,所以假设它会相对于新的变换原点旋转。但不管怎样,它还是奏效了。。。我想知道为什么

但主要问题是:为什么100%

我为您提供了高cpu使用率项目的油漆代码:

// Translate all to the center of the ruler calculated in the itemChange method.
  painter->translate(rulerCenter_);
  // rotate with the center where the ruler center is
  //setTransformOriginPoint(rulerCenter_); <-- BRINGS 100% USAGE, NO SENSE WHY IT WORKS WITHOUT THIS.

  painter->rotate(rulerRotation_);

  // Set the color for the lines and quality of the lines
  painter->setRenderHint(QPainter::Antialiasing, true);
  painter->setPen(linesColor_);

  // Draw long line of the ruler next to the wall
  painter->drawLine(-length_/2,0,length_/2,0);

  // Lines in the sides
  painter->drawLine(-length_/2, 0, -length_/2, -sideLinesSize_); 
  painter->drawLine(length_/2, 0, length_/2, -sideLinesSize_); 

  // if we should flip the text for the user to read it properly...
  if (flippedText_)
    painter->rotate(180);

  // Prepare for the text box, moving it to be centered
  painter->translate(-textBox_.width()/2,-textBox_.height()/2);

  // draw a box under the text so it hides whatever is under it
  painter->setBrush(textBackgroundColor_);
  painter->setPen(Qt::NoPen);
  painter->drawRect(textBox_);

  // Draw the text
  painter->setPen(pen_);
  painter->setFont(font_);
  painter->setRenderHint(QPainter::HighQualityAntialiasing, true);
  painter->drawText(textBox_, Qt::AlignCenter, meassureString_ );
//将所有内容转换为在itemChange方法中计算的标尺的中心。
画家->翻译(规则中心);
//以标尺中心所在的中心旋转
//设置TransformOriginPoint(规则中心);旋转(规则箭头);
//设置线条的颜色和线条的质量
painter->setRenderHint(QPainter::抗锯齿,true);
画家->设置笔(线条颜色);
//在墙上画一条长的尺子线
油漆工->拉丝(-长度/2,0,长度/2,0);
//两边的线条
油漆工->拉丝(-length_u/2,0,-length_u/2,-sidelessize_u);
画师->绘制线(长度为2,0,长度为2,-边线化);
//如果我们应该翻转文本以便用户正确阅读。。。
如果(翻转文本)
油漆工->旋转(180);
//准备文本框,将其移动到中心位置
painter->translate(-textBox.width()/2,-textBox.height()/2);
//在文本下方绘制一个框,以便隐藏文本下方的内容
画家->挫折(textBackgroundColor);
画师->设置笔(Qt::NoPen);
painter->drawRect(文本框);
//画课文
画师->设置画笔(画笔);
画师->设置字体(字体);
painter->setRenderHint(QPainter::高质量抗锯齿,true);
画师->绘图文本(文本框,Qt::对齐中心,测量限制);

您应该将渲染与所有其他处理任务分开

绘制功能仅用于绘制项目,而不用于移动或旋转对象。如果尝试在paint函数中执行渲染以外的任何操作,将延迟或暂停图形管道。这可能就是调用setTransformOriginPoint时发生的情况

在渲染之前设置图形管道需要大量的处理。如果暂停管道,它必须再次执行,这将占用100%的处理器时间


尽管它描述了ARM处理器中发生的事情,.

为什么要在paint函数中调用
setTransformOriginPoint()
?谢谢!但我不明白。。。我定位项目,因为每次我绘制一个项目或其他项目制作的复杂项目时,画家都会重置,因此我必须始终移动画笔并绘制线、旋转、绘制另一条线,等等。。。我知道这些位置,但每次画画我都得重新装填!如果您在问题中添加绘制函数的示例代码,我将解释与此相关的问题。好的,所有其他调用都通过绘制程序执行旋转/平移,这很好。在我看来,您遇到的问题是,在调用任何绘制函数之前,我希望系统能够根据GraphicsItem的内部矩阵(局部位置和方向)设置一些内容。一旦完成,它就可以调用项目的绘制函数。但是,通过在paint函数中调用setTransformOrigin,GraphicsItem的矩阵在渲染过程中会发生更改,这会暂停图形管道,因为它必须为该项重新设置。