OP声称
如何使用另一个滑块来更改 QTimer 发出的超时间隔?我尝试过使用 setInterval 但似乎一旦设置了时间间隔就无法更改。
我对这个说法有点想知道,因为我可以发誓你可以随时更改间隔。
我会考虑的唯一限制是:在下一次超时发生之前可能不会考虑新设置的间隔。 (通常,我使用单次计时器或间隔较小的计时器,这样您就不会注意到差异。)
在玩我的演示时,我得到的印象是一个调用QTimer::setInterval()
重新开始间隔。
不幸的是,医生。的QTimer::setInterval() https://doc.qt.io/qt-5/qtimer.html#interval-prop没有明确提到这种行为,除了:
设置活动定时器的间隔会更改其timerId()。
谢谢@斯科普查诺夫 https://stackoverflow.com/questions/64300917/change-interval-timeouts-of-qtimer-with-slider/64301362?noredirect=1#comment113716591_64301362谁查看了源代码(我太懒了)。
QTimer::setInterval() https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qtimer.cpp.html#_ZN6QTimer11setIntervalEi:
void QTimer::setInterval(int msec)
{
inter = msec;
if (id != INV_TIMER) { // create new timer
QObject::killTimer(id); // restart timer
id = QObject::startTimer(msec, Qt::TimerType(type));
}
}
因此,实际上,在计时器运行时设置间隔,它会终止当前正在运行的计时器并重新启动一个新计时器。
My MCVE https://stackoverflow.com/help/minimal-reproducible-example用于演示 –testQTimer.cc
:
// Qt header:
#include <QtWidgets>
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QWidget qWinMain;
qWinMain.setWindowTitle("Test QTimer");
QFormLayout qForm;
QSlider qSliderInterval(Qt::Horizontal);
qSliderInterval.setRange(100, 1000);
qForm.addRow("Interval: ", &qSliderInterval);
QSlider qSliderStep(Qt::Horizontal);
qSliderStep.setRange(1, 10);
qForm.addRow("Step: ", &qSliderStep);
QPushButton qBtnStartStop("Start / Stop");
qForm.addRow("Timer:", &qBtnStartStop);
QSlider qSliderAnim(Qt::Horizontal);
qForm.addRow("Animation:", &qSliderAnim);
qSliderAnim.setRange(0, 100);
qWinMain.setLayout(&qForm);
qWinMain.show();
// setup timer
QTimer qTimer;
qTimer.setInterval(qSliderInterval.value());
// install signal handlers
QObject::connect(&qSliderInterval, &QSlider::valueChanged,
[&](int value) { qTimer.setInterval(value); });
QObject::connect(&qBtnStartStop, &QPushButton::clicked,
[&]() {
if (qTimer.isActive()) qTimer.stop();
else qTimer.start();
});
QObject::connect(&qTimer, &QTimer::timeout,
[&]() {
int value = qSliderAnim.value() + qSliderStep.value();
if (value > qSliderAnim.maximum()) {
value -= qSliderAnim.maximum() - qSliderAnim.minimum();
}
qSliderAnim.setValue(value);
});
// runtime loop
return app.exec();
}
Output:
Qt Version: 5.13.0