0

私は自分の娯楽のためにニューロンの基本機能をシミュレートするプログラムを作成しようとしてきましたが、一定期間にわたって整数を減らす必要があるため、QTimer を使用することにしました。

私の問題は、私のプログラムがメソッド「changeVoltage」に到達し、タイマーを開始する行に到達すると、プログラムが即座にクラッシュすることです。

プログラムが開始されると、ボルトの値は -40 で、「励起」ボタンを押すと、値 10 で changeVoltage をトリガーすることにより、電圧が 10 増加して -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 に答える