项目场景:
在做一个主界面线程调用子线程进行进度条显示的测试项目中,出现了在构造函数中已经声明并实例化了子类对象,但是在槽函数中使用的话却显示”未定义标识符” 这种错误。
问题描述
直接给贴上项目部分代码:
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问题多样,欢迎交流讨论,仅供参考!