Использование QSlider, QTimer и valueChanged

Я пытаюсь использовать сигнал QSlider, QTimer и valueChanged () вместе, но мне нужно различать, изменяется ли значение ползунка пользователем или отметкой времени. Как я могу сделать это? По приведенному ниже коду я пытаюсь решить, когда ползунок изменяется по таймеру, но я не мог решить, когда пользователь изменил сигнал. (Более того, это анимация OpenGL, и слайдер ведет себя как временная шкала, даже если временная шкала меняет значение, каждую секунду анимация воспроизводит 30 Гц, поэтому, если пользователь хочет использовать слайдер для перемещения анимации вперед или назад, мне нужно проверить сигнал слайдера. Однако у слайдера есть одна секундная отметка от таймер)

connect(timer, SIGNAL(timeout()), this,SLOT(timerTick()));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(sliderChange()));

void MainWindow::sliderChange()
{
if (userInterrupt)
{
.. Call Function A
}
}
void MainWindow::timerTick()
{
slider->setValue(slider.value()+1);
userInterrupt=false;
}

РЕДАКТИРОВАТЬ: отправитель добавлен, но из-за рекурсии он не может работать четко. Я все еще не мог определиться с сигналом

 connect(timer, SIGNAL(timeout()), this,SLOT(sliderChange()));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(sliderChange()));

void MainWindow::sliderChange()
{
QObject * obj =sender();
if (obj==slider)
{
.. Call Function A
}else
{
slider->setValue(slider.value()+1);
}
}

2

Решение

Вы можете использовать QObject :: sender, чтобы получить указатель на QObject, который испустил сигнал.

1

Другие решения

После того, как я попробовал отправитель и сигналы блокировки, мне не удалось решить проблему. Поэтому я нахожу другое более примитивное решение для обработчика слайдера, как показано ниже. Тем не менее, я все же думаю, что sender и blocksignal — лучший способ решить проблему, и попытаться сделать это также, пока код, указанный ниже, не решит мою проблему. В основном, я использую разные сигналы для выпуска, щелкаю и перетаскиваю на слайдер.

connect(timer, SIGNAL(timeout()), this,SLOT(timerTick()));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(sliderChange()));
connect(slider, SIGNAL(sliderReleased()),this, SLOT(userRelease()));
connect(slider, SIGNAL(sliderPressed()),this, SLOT(userClick()));

void MainWindow::sliderChange()
{
// Action when it is changes
// in my case calculate time where animation will resume on
// but do not show any data on animation until release
// release slot will deal with it
}

void MainWindow::userClick()
{
// Actions when mouse button is pressed
// in my case pause animation
}
void MainWindow::userRelease()
{
// Action when mouse button is released
// in my case resume showing animation with slider value
}
void MainWindow::timerTick()
{
slider->setValue(slider.value()+1);
userInterrupt=false;
}
1

По вопросам рекламы [email protected]