QTimer се срива, когато се стартира в отделен метод

Опитвам се да създам програма, която симулира основната функционалност на неврон за мое собствено забавление и трябва да намалявам цяло число за определен период от време, така че реших да използвам QTimer.

Проблемът ми е следният, когато програмата ми достигне метода "changeVoltage" и реда, който стартира таймера, програмата моментално се срива.

Когато програмата стартира, стойността на волта е -40 и натискането на бутона 'excite' увеличава напрежението с 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 = нов QTimer(this); Таймерът не е ли членска променлива. Тъй като се опитвате да получите достъп до него в Neuron::changeVoltage   -  person drescherjm    schedule 19.10.2013
comment
Това, което имам предвид, е замяна на QTimer *timer = нов QTimer(this); с този таймер = нов QTimer(това);   -  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