QTimer аварийно завершает работу при запуске в отдельном методе

Я пытался создать программу, которая имитирует основные функции нейрона для собственного развлечения, и мне нужно уменьшать целое число в течение определенного периода времени, поэтому я решил использовать QTimer.

Моя проблема в том, что когда моя программа доходит до метода "changeVoltage", и строки запускающей таймер, программа моментально вылетает.

Когда программа запускается, значение volt равно -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 не запускается. Нельзя ли его активировать вне линии после ее подключения? Есть ли другие способы добиться того, чего я пытаюсь достичь?


person Yattabyte    schedule 19.10.2013    source источник
comment
Вы действительно хотели сделать это QTimer *timer = new QTimer(this); Таймер не является переменной-членом. Поскольку вы пытаетесь получить к нему доступ в Neuron::changeVoltage   -  person drescherjm    schedule 19.10.2013
comment
Я имею в виду замену QTimer *timer = new QTimer(this); с этим таймером = новый QTimer(this);   -  person drescherjm    schedule 19.10.2013
comment
volt, refract и timerActive должны быть членами класса.   -  person Frank Osterfeld    schedule 19.10.2013


Ответы (1)


Проблема здесь:

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 );
person Iuri Covalisin    schedule 19.10.2013