Qt:如何在后台自动循环滑块移动?

时间:2014-11-04 15:44:44

标签: c++ qt

当按下按钮时,滑块以给定速度在循环中移动的最简单方法是什么?我猜测它涉及分叉一个线程,该线程定期向滑块发送适当的信号。这样做有规范方法吗?

4 个答案:

答案 0 :(得分:2)

这只是更新滑块在计时器上的位置的问题。因此,创建一个计时器,并在每次更新时调用QSlider::setValue

当值达到最大值时,将其设置为最小值并继续。

QSlider* pSlider = new QSlider;

QButton * pButton = new QButton("Go");

QTimer* pTimer = nullptr; // C++ 11 nullptr

// On button click, start a timer
connect(pButton, &QButton::clicked(), [=](){

  // exit if already running
  if(pTimer)
      return;       

   pTimer = new QTimer;
   connect(pTimer, &QTimer::timeout, [=](){

       if(pSlider->value()+1 > pSlider->maximum())
           pSlider->setValue(pSlider->minimum());
      else
           pSlider->setValue(++pSlider->value());       
   });
   pTimer->start(1000); // update every second
});

答案 1 :(得分:2)

我建议使用QPropertyAnimation来完成这项工作。只需设置您想要更改值的起始值,结束值和曲线

QPropertyAnimation *animation = new QPropertyAnimation(slider,"sliderPosition");
//set the duration (how long the animation should run - will change value faster when shorter)
animation->setDuration(1000);
//set the start value - in this case check if value in range of the slider
animation->setStartValue(slider->minimum());
//same as start value
animation->setEndValue(slider->maximum());
//easingCurve defines if it goes straight or bouncing n stuff
animation->setEasingCurve(QEasingCurve::OutCubic);

// as coyote mentioned, you can loop the animation as well (credit him as well ;))
// -1 defines to run forever
animation->setLoopCount(loopCount)

animation->start();

答案 2 :(得分:1)

您可以使用QTimer。最小的例子:

QSlider *sl = new QSlider;
QTimer *ttt = new QTimer;
sl->setValue(0);

connect(ttt,&QTimer::timeout,[=]() {
    sl->setValue(sl->value() + 5);
});
sl->show();
ttt->start(500);

我在这里使用C++11CONFIG += c++11.pro文件)和new syntax of signals and slots,但当然如果需要,您可以使用旧语法。

答案 3 :(得分:1)

我的知识没有规范的方法。

定时器在其他答案中给出,但您也可以使用animation framework,并通过调整动画的持续时间来调整速度。

您可以将loopcount设置为您希望动画运行的次数,例如1000000以使其运行很长时间。