我可以使用滑块更改屏幕上显示的图像吗?
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
我想使用此滑块输出的值来更改加载到 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