c++ - 单独的 QT 小部件实例

标签 c++ qt qwidget instances

我认为我的问题非常简单,我可能忽略了一些非常明显的事情,但我已经有一段时间没能解决这个问题了。

在我当前的 QT 项目中,我有 2 个文件,其中一个是窗口,另一个是小部件。我的窗口调用我的“自定义”小部件并创建它的实例并将其注入(inject)框架。将小部件放置到窗口中是由一个可以单击多次的按钮控制的,因为我最终希望一次在屏幕上显示多个小部件实例。

这就是问题所在:每当我的小部件的一个新实例被放置在框架中时,它们似乎只是在镜像彼此的值,这意味着当我在小部件的第一个实例中做一些事情时,它会发生在小部件的每个实例中小部件(但是,它有时似乎不会立即更新,但我知道它会发生)。 我希望它们成为独立的实例,它们将在未来相互交互。

这是我处理注入(inject)小部件的方式:

    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

最佳答案

'volt' 不是成员变量 - 它是文件局部变量。只有其中一个。使它成为一个成员变量(放在类中),你的问题就会消失。

类似于:

class Neuron {
private:
  int volt;
};

在构造函数中,设置它的初始值:

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

关于c++ - 单独的 QT 小部件实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19938816/

相关文章:

c++ - 每个程序上的 "logout"字

c++ - __COUNTER__ 宏是否可移植?

c++ - yaml-cpp 出现编译器错误

c++ - 带有 Crypto++ 库的 QT 控制台应用程序

qt - 你可以设置一个 QWidget 来占据 QTreeWidget 的整个列吗?

qt - 基于样式表伪状态值绘制自定义QWidget

c++ - Qt - 在不使用 WA_TranslucentBackground 的情况下在 Windows 中绘制一个完全透明的窗口

qt - 为什么将一个 QWidget 设置为另一个 QWidget 的父级时不显示?

c++如何解决: Initial value of reference to non-const must be an lvalue

c++ - QProcess 已失效且无法重新启动