[vs+qt]VS联合QT编程,在构造函数中已经声明并实例化了子类对象,但是在槽函数中使用的话却显示 未定义标识符

项目场景:

在做一个主界面线程调用子线程进行进度条显示的测试项目中,出现了在构造函数中已经声明并实例化了子类对象,但是在槽函数中使用的话却显示”未定义标识符” 这种错误。


问题描述

直接给贴上项目部分代码:

ProgressBar::ProgressBar(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    this->setFixedSize(600, 400);
    
    QPushButton* btn1 = new QPushButton(QString::fromLocal8Bit("开启线程"),this);
    btn1->setGeometry(260, 180, 80, 40);

    bar1 = new QProgressBar(this);
    bar1->setGeometry(60, 280, 520, 20);
    bar1->setRange(0, 100);
    bar1->setValue(0);
   
    Bar* bar = new Bar(this);//这里是子线程的声明加实例对象过程

    connect(btn1, &QPushButton::clicked, this, &ProgressBar::slot_startXc);
    connect(bar, &Bar::sendVaule, this, &ProgressBar::slot_acceptValue);
}

void ProgressBar::slot_startXc()
{
    bar->start();//这里是问题出现的地方,显示bar是未定义的标识符
}

原因分析:

平时使用的话,像上述那种实例化出对象之后就直接使用了,所以一共有两种写法:
1.先在头文件中进行声明指针变量,然后在cpp文件中进行实例并分配地址

private:
    Ui::ProgressBarClass ui;
    Bar* bar;
    QProgressBar* bar1;
    bar = new Bar(this);
    bar1 = new QProgressBar(this);

2.在cpp中使用的时候一起进行声明加实例化

    QPushButton* btn1 = new QPushButton(QString::fromLocal8Bit("开启线程"),this);
    btn1->setGeometry(260, 180, 80, 40);

但是没有过这次的情况,一时间无从下手,经过查找,最终发现问题:
可能是由于Bar* bar被声明在构造函数的局部作用域内,因此在槽函数slot_startX函数中无法访问。

解决方案:

将 Bar* bar 声明为ProgressBar类的私有成员变量,这样它就可以在整个类中使用,包括在slot_startXc函数中。即第一种实例化对象的方法

下面是类的头文件

class ProgressBar : public QWidget
{
    Q_OBJECT

public:
    ProgressBar(QWidget *parent = nullptr);
    ~ProgressBar();

private:
    Ui::ProgressBarClass ui;
    Bar* bar;//!!!!!!!!★★★★★★
    QProgressBar* bar1;

private slots:
    void slot_startXc();
    void slot_acceptValue(int value);
};

本文为自己学习记录,bug问题多样,欢迎交流讨论,仅供参考!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值