Я пытался создать программу, которая имитирует базовую функциональность нейрона для моего собственного развлечения, и мне нужно уменьшить целое число в течение определенного периода времени, поэтому я решил использовать QTimer.
Моя проблема в том, что, когда моя программа достигает метода «changeVoltage», и в строке, которая запускает таймер, программа мгновенно падает.
Когда программа запускается, значение вольта равно -40, а нажатие кнопки «Возбуждение» увеличивает напряжение на 10, делая его равным -30, вызывая changeVoltage со значением 10. Теоретически, оно не должно распознаваться как более высокое, чем 50, больше не находится на исходном уровне (что, если бы это было так, то закончило бы таймер и уменьшило напряжение), но является выше -40, что должно запустить таймер (заставляя таймер медленно уменьшать вольт на 1). Но таймер даже не запускается, потому что когда он достигает этой строки, вся программа падает.
Этот файл выглядит следующим образом:
#include "neuron.h"#include "ui_neuron.h"#include "qtimer.h"
int volt = -40;
bool refract = false;
bool timerActive;
Neuron::Neuron(QWidget *parent):QWidget(parent), ui(new Ui::Neuron)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(changeVoltage()),Qt::DirectConnection );
timerActive = false;
}
Neuron::~Neuron()
{
delete ui;
}
void Neuron::on_btnExc_clicked()
{
changeVoltage(10);
}
void Neuron::on_btnInh_clicked()
{
changeVoltage(-10);
}
void Neuron::changeVoltage(int c)
{
volt = (volt + c);
if (volt >= 50) // begin action potential
{
volt = volt -40;
}
if (volt == -40) // to not drop below -40
{
if (timerActive == true)
{
timer->stop();
}
volt = -40;
}
else if (volt >= -40)//start the timer when value changes upwards from -40
{
if (timerActive == false)
{
timerActive = true;
timer->start(1000);
}
}
ui->lblVolt->setText(QString::number(volt));
}
void Neuron::changeVoltage()
{
changeVoltage(-1);
}
Я отлаживал и пробовал это в течение нескольких часов и не могу понять, почему QTimer не запускается.
Разве он не может быть активирован вне линии, следующей за подключением? Есть ли другие способы достичь того, чего я пытаюсь достичь?
Проблема здесь:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(changeVoltage()),Qt::DirectConnection );
Я предполагаю, что таймер также является членом класса, иначе код не скомпилируется. В приведенном выше коде вы заменяете член класса переменной стека. Исправить это:
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(changeVoltage()),Qt::DirectConnection );
Других решений пока нет …