0

我一直在尝试创建一个程序来模拟神经元的基本功能以供我自己娱乐,并且我需要在一段时间内递减一个整数,所以我决定使用 QTimer。

我的问题是,当我的程序到达方法“changeVoltage”时,启动计时器的行,程序立即崩溃。

当程序启动时,伏特的值为-40,按下“激发”按钮将电压增加10,通过触发值为10的changeVoltage使其变为-30。理论上,它不应被识别为高于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 没有启动。连接后不能在线路外激活吗?还有其他方法可以实现我想要实现的目标吗?

4

1 回答 1

3

问题在这里:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(changeVoltage()),Qt::DirectConnection );

我假设 timer 也是一个类成员,否则代码将无法编译。在上面的代码中,您将类成员替换为堆栈变量。修复是:

timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(changeVoltage()),Qt::DirectConnection );
于 2013-10-19T03:15:48.750 回答