关于Qt statusbar 和QLabel的问题

时间:2021-09-27 22:44:11
写了个程序,想在mainwindow的默认statusbar中显示程序运行信息。我这样做的。
1.首先在mainwindow.h中
添加class QLabel;
添加QLabel声明
private:
    QLabel *communicationinfo;
    QLabel *operationinfo;
    QLabel *tempinfo;
2.在mainwindow.C中添加
#include <QLabel>
statusinit函数,实现如下
void MainWindow::statusbarinit()
{
    QLabel *tempinfo =new QLabel;
    QLabel *communicationinfo=new QLabel;
    QLabel *operationinfo=new QLabel;

    tempinfo->setMinimumSize(150, 30); // 设置标签最小大小
    tempinfo->setFrameShape(QFrame::Panel); // 设置标签形状
    tempinfo->setFrameShadow(QFrame::Sunken); // 设置标签阴影
    tempinfo->setTextFormat(Qt::PlainText);

    communicationinfo->setMinimumSize(150, 30); // 设置标签最小大小
    communicationinfo->setFrameShape(QFrame::Panel); // 设置标签形状
    communicationinfo->setFrameShadow(QFrame::Sunken); // 设置标签阴影
    communicationinfo->setTextFormat(Qt::PlainText);

    operationinfo->setMinimumSize(150, 30); // 设置标签最小大小
    operationinfo->setFrameShape(QFrame::Panel); // 设置标签形状
    operationinfo->setFrameShadow(QFrame::Sunken); // 设置标签阴影
    operationinfo->setTextFormat(Qt::PlainText);

    ui->statusBar->addWidget(tempinfo,1);
    ui->statusBar->addWidget(communicationinfo,1);
    ui->statusBar->addWidget(operationinfo,1);

    operationinfo->setText("label3");
    communicationinfo->setText("label2");
    tempinfo->setText("label1");
}
到此,Statusbar设置成功,编译通过,显示内容位labe1,2,3.无错错误。

但是当我在mainwindow的其他函数中调用
  tempinfo->setText(string);时,程序会崩溃,报的错误是程序crash。
我以为是声明的QLabel被释放了,将new的语句更改为
    QLabel *tempinfo =new QLabel(this);
    QLabel *communicationinfo=new QLabel(this);
    QLabel *operationinfo=new QLabel(this);
上述语句,依然不行。


经过多此次测试,发现在初始化函数中写什么都没问题,但是只要是在初始化函数意外的函数调用QLabel的任何函数都会崩溃。
请教,我错在哪里,实在想不明白。

7 个解决方案

#1


我在使用QT CREATOR + mingw 中,遇到过这种莫名其妙的问题,

重启后 clean - > qmake -> rebuild -> run

楼主可以试试 

#2


引用 1 楼 kuyucman 的回复:
我在使用QT CREATOR + mingw 中,遇到过这种莫名其妙的问题,

重启后 clean - > qmake -> rebuild -> run

楼主可以试试 


我也遇到过莫名其妙的问题,这里我已经重启过了,电脑和qt creator都重启过了

#3


    tempinfo =new QLabel;
    communicationinfo=new QLabel;
    operationinfo=new QLabel;
这样就可以了。

#4


那么你在初始化函数外调用QLabel::setText 时,该对象确实有效吗

#5


引用 3 楼 xiaxuelasd 的回复:
    tempinfo =new QLabel;
    communicationinfo=new QLabel;
    operationinfo=new QLabel;
这样就可以了。


对头,看来是你代码问题,初始化函数用的局部变量,而外面使用的是未初始化的成员变量

#6


问题解决了。。。
错误在于,我在头文件中已经声明了QLabel,但是在函数中又声明了一次QLabel,所以此时导致全局QLabel并没有被初始化,所以才会在访问的时候崩溃,因为访问的确实是未初始化的指针。

#7


引用 3 楼 xiaxuelasd 的回复:
    tempinfo =new QLabel;
    communicationinfo=new QLabel;
    operationinfo=new QLabel;
这样就可以了。


你说的对,我的笔误,写程序的时候估计的脑袋浆糊了,这种错误都会犯。

#1


我在使用QT CREATOR + mingw 中,遇到过这种莫名其妙的问题,

重启后 clean - > qmake -> rebuild -> run

楼主可以试试 

#2


引用 1 楼 kuyucman 的回复:
我在使用QT CREATOR + mingw 中,遇到过这种莫名其妙的问题,

重启后 clean - > qmake -> rebuild -> run

楼主可以试试 


我也遇到过莫名其妙的问题,这里我已经重启过了,电脑和qt creator都重启过了

#3


    tempinfo =new QLabel;
    communicationinfo=new QLabel;
    operationinfo=new QLabel;
这样就可以了。

#4


那么你在初始化函数外调用QLabel::setText 时,该对象确实有效吗

#5


引用 3 楼 xiaxuelasd 的回复:
    tempinfo =new QLabel;
    communicationinfo=new QLabel;
    operationinfo=new QLabel;
这样就可以了。


对头,看来是你代码问题,初始化函数用的局部变量,而外面使用的是未初始化的成员变量

#6


问题解决了。。。
错误在于,我在头文件中已经声明了QLabel,但是在函数中又声明了一次QLabel,所以此时导致全局QLabel并没有被初始化,所以才会在访问的时候崩溃,因为访问的确实是未初始化的指针。

#7


引用 3 楼 xiaxuelasd 的回复:
    tempinfo =new QLabel;
    communicationinfo=new QLabel;
    operationinfo=new QLabel;
这样就可以了。


你说的对,我的笔误,写程序的时候估计的脑袋浆糊了,这种错误都会犯。