2013-11-12 3 views
1

Я думаю, что моя проблема очень проста, и я, вероятно, скрою что-то невероятно очевидное, но я не смог решить это на некоторое время.Отдельные экземпляры 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 
+0

Ваш код выглядит правильно. Вероятно, ошибка связана с реализацией Neuron. (Используете ли вы статические переменные или такие, чтобы сохранять их состояние?) –

+0

Я не делал ни одной из моих переменных статичными, насколько я знаю, но я, должно быть, что-то прикрутил. Я обновляю свой вступительный пост с основной частью моего кода «Нейрона». – Yattabyte

ответ

2

«вольт» не является переменной-члена - это локальная переменная файла. Есть только один из них. Сделайте его переменной-членом (поместите его в класс), и ваша проблема исчезнет.

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

class Neuron { 
private: 
    int volt; 
}; 

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

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

Правильно, но это относится не только к вольт, но и к другим переменным –

+0

Спасибо, кажется, полностью решает мою проблему. Вы, ребята, все так быстро ответили, лишняя благодарность! – Yattabyte

Смежные вопросы