我可以使用滑块更改屏幕上显示的图像吗?

Can I change the image displayed on screen with a slider?

我想使用此滑块输出的值来更改加载到 img 变量中的图像。每当滑块移动时都会调用绘制函数。

滑块的值为 0 - 2。当滑块 > 1 时,第二个 if 语句测试正确,但是图像没有改变。如果没有 if 语句,我可以手动切换图像,否则它不会按照我的预期进行。

 void ModelGUI::sliderValueChanged(Slider* slider)
{
  rotate.getValue();
  DBG(rotate.getValue());

}
void ModelGUI::paint (Graphics& g)
{
    DBG("PAINT");
    g.setColour(Colours::red);

    if(rotate.getValue() < 1)
    {
        img = ImageFileFormat::loadFrom(f);
    }
    if(rotate.getValue() > 1)
    {
        img = ImageFileFormat::loadFrom(f2);
    }
    g.drawImage(img, model);

    g.drawEllipse(225, 230, 2, 2, 2);
    g.drawEllipse(240, 240, 2, 2, 2);
    g.drawEllipse(245, 275, 2, 2, 2);
}

为什么会这样?干杯

只是一个疯狂的猜测,但你不应该以某种方式在 sliderValueChanged 事件中强制重绘吗?我不知道 juce 但我希望其中之一:

g.Repaint();
g.Refresh();
g.Update();

因为更改滑块可能只是重新绘制滑块本身,而不是更新 GUI 的其余部分。 g 应该是你的 Graphics 粗对象。

如果重绘真的很耗时,那么我通常会这样做:

bool _redraw=false; // some global variable (or local but accessible to your GUI/Form/Canvas whatever)

void any_event()
 {
 // here event stuff code
 if (need_to_repaint) _redraw=true; // for example you change something hit a special key that changes something etc ...
 }

void timer() // any timer with target max fps interval
 {
 if (_redraw())
  { 
  _redraw=false;
  // here force repaint or call the repaint directly
  }
 }

这样重绘就不会减慢其他事件太多。例如,如果我在轮子上使用缩放并且我正在渲染很多东西,如果在每次更换轮子时重新绘制轮子,轮子可能会感觉很粗糙。这将仅使用定时器周期重绘,如果设置正确应该没问题。

通常需要此类处理的事件是缩放、鼠标 move/edit 和 window/view 调整大小,因为它们每秒可以创建大量事件调用...

正如@Spektre 推测的那样——在 JUCE 中,您的组件需要在知道有必要时请求重新绘制。在这种情况下:

void ModelGUI::sliderValueChanged(Slider* slider)
{
   rotate.getValue();
   DBG(rotate.getValue());
   repaint();
}

...将使您的 ModelGUI 组件(及其所有子组件)在下一个合理的时间点重新绘制。

参见:https://docs.juce.com/master/classComponent.html#af3ab3eabec93dd60faf983370f3a1206