Отдельные экземпляры виджета QT

Я думаю, что моя проблема очень проста, и я, вероятно, упускаю из виду что-то невероятно очевидное, но я не мог решить это некоторое время.

В моем текущем проекте QT у меня есть 2 файла, один из которых — окно, другой — виджет. Мое окно вызывает мой «пользовательский» виджет, создает его экземпляр и внедряет его в кадр. Это размещение виджета в окне контролируется кнопкой, которую можно нажимать много раз, потому что я в конечном счете хочу много экземпляров виджета на экране одновременно.

Вот проблема: всякий раз, когда новый экземпляр моего виджета помещается в фрейм, они, кажется, просто отражают значения друг друга, то есть, когда я делаю вещи в первом экземпляре виджета, это происходит в каждом экземпляре виджета (однако иногда это не обновляется сразу, но я знаю, что это происходит).
Я хочу чтобы они были отдельные случаи которые в будущем будут взаимодействовать друг с другом.

Вот как я управляю внедрением виджета:

    void Window::on_btnNewCell_clicked()
{
ui->verLay->addWidget(new Neuron());
}

И вот основная часть кода моего виджета:

#include "neuron.h"#include "ui_neuron.h"#include "qtimer.h"
// Define Neuron Properties
int volt = -70;
int rest = -70;
int max = 40;

// Logic Contol
int excAmt = 10;
int inhAmt = -10;
bool refract = false;
bool timerActive;
bool st = true;

Neuron::Neuron(QWidget *parent):QWidget(parent), ui(new Ui::Neuron)
{
ui->setupUi(this);
//Homeostatic Voltage Changing Timer
tiHom = new QTimer(this);
connect(tiHom, SIGNAL(timeout()), this, SLOT(changeVoltage()),Qt::DirectConnection );

//Duration of mouse depression timer
tiPrs = new QTimer(this);
connect(tiPrs, SIGNAL(timeout()), this, SLOT(chgVltg()),Qt::DirectConnection );
timerActive = false;
}

Neuron::~Neuron()
{
delete ui;
}

// CUSTOM METHODS
void Neuron::changeVoltage(int c)
{
volt = (volt + c);

if (volt >= max) // begin action potential
{
volt = rest;
timerActive = false;
tiHom->stop();
ui->chkFired->setChecked(true);
}

if (volt <= rest) // to not drop below -40
{
if (timerActive == true)
{
timerActive = false;
tiHom->stop();
}
volt = rest;
}

else if (volt >= rest) // to drop it to -40
{
if (timerActive == false)
{
timerActive = true;
tiHom->start(100);
}
}
ui->lblVolt->setText(QString::number(volt));
}

void Neuron::changeVoltage()
{
changeVoltage(-1);
}

void Neuron::chgVltg()
{
if (st == true)
{
changeVoltage(excAmt);
}
else
changeVoltage(inhAmt);
}
void Neuron::updateGlow(int i, bool b)
{
QPixmap pic;
if (b == true) {
if (st == true) pic.load(":/Images/Excitatory/" +QString::number(i) +".png");
else pic.load(":/Images/Inhibitory/" +QString::number(i) +".png");
ui->lblE->setPixmap(pic);
ui->lblE->setEnabled(true);
tiPrs->start(100);
}
else
{
ui->lblE->setEnabled(false);
tiPrs->stop();
}
}
//many additional redundant methods for a lack of an efficient way of implementing them

1

Решение

‘volt’ не является переменной-членом — это локальная переменная файла. Там только один из них. Сделайте его переменной-членом (поместите его в класс), и ваша проблема исчезнет.

Что-то вроде:

class Neuron {
private:
int volt;
};

И в конструкторе установите его начальное значение:

Neuron::Neuron(QWidget *parent) : QWidget(parent), ui(new Ui::Neuron), volt(5)
{ /* existing code */ }
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]