欣坚强 2022-12-21 19:55 采纳率: 57.4%
浏览 15

为什么也初始化了还QT程序异常

不知道为什么突然就到这个窗口(第一个窗口)就报程序异常,然后将下面有关mu的代码全部注释掉才不会报这个错误,但是,mu这个也声明过了并且也初始化了,为什么还要报这个错误呢?

 mu=new menu(this);

 QObject::connect(this,SIGNAL(sendStr(QString)),mu,SLOT(getStr(QString)));
 emit this->sendStr(intelenum);

 //场景转换
 //隐藏当前窗口
this->hide();
 //显示第二个窗口 menu菜单页
mu->show();

login.cpp

#include "login.h"
#include "bankpushbutton.h"
#include "bankregisterbutton.h"
#include "comparephone.h"
#include "telephone_multi_input.h"
//#include "staff_function.h"

#include <QPushButton>
#include <QTimer>
#include <QLineEdit>
#include <QDebug>
#include <QMessageBox>
#include <QTableWidget>
#include <QHeaderView>
#include <QVBoxLayout>
#include <QPainter>
#include <QPropertyAnimation>

#include <iostream>
#include <algorithm>
#include <string>
#include <sstream>
#include <fstream>
#include <cstdlib>

using namespace std;

string getgetStaffString(const QString qstr)
{
    QByteArray cdata = qstr.toLocal8Bit();
    return string(cdata);
}

login::login(QWidget *parent) : Bank_Widget(parent)
{
    //telephonenumber图标
    telephone_multi_input *tele_image=new telephone_multi_input(this);

    //调整大小
    tele_image->setFixedSize(60,60);
    tele_image->setEnabled(false);

    //调整位置
    tele_image->move(this->width()*1/4-tele_image->width()*3/4,this->height()*1/5-tele_image->height()*3/4);

    //手机号输入框
    QLineEdit *telenum=new QLineEdit(this);

    //设置输入框的大小
    telenum->setFixedSize(200,40);
    //设置输入框的最大长度
    telenum->setMaxLength(11);
    //设置输入框的提示语
    telenum->setPlaceholderText("手机号");

    //手机号输入框的位置
    telenum->move(this->width()*1/3,this->height()*1/5-telenum->height()*4/5);

    //登录按钮
    bankPushButton *btnLogin=new bankPushButton(this);
    btnLogin->resize(60,60);

    //按钮的位置
    //按钮水平位置居中,垂直位置在3/4处
    //计算方式 x=窗口的宽度*3/4-按钮宽度*3/4 y=窗口的高度*2/5-按钮的高度/5(-btnLogin->height()*4/5)
    btnLogin->move(this->width()*3/4-btnLogin->width()*3/4,this->height()*2/5-btnLogin->height()/5);

    connect(btnLogin,&bankPushButton::clicked,[=](){
        //虽然向右动画播放完成之后才会启用向左的动画
        //但是若一直点击,时间差在150毫秒以内,很可能会出现向左动画覆盖向右动画
        //所以通过设置按钮的可不可用来防止多次连续点击
        //将按钮设置为不可用
        btnLogin->setEnabled(false);

        //播放向右
        btnLogin->moveright();

        //QTimer相当于一个定时器
        //150为时间
        //后面的lamda表达式为槽
        QTimer::singleShot(150,[=](){
            //播放向左
            //向右的动画需要100毫秒才能播放完成
            //而此处调用的向左走的动画会等不及向右走的动画播放完成就会播放
            //导致了向左走的动画覆盖了向右走的动画
            btnLogin->moveleft();
        });

        QTimer::singleShot(300,[=](){
            //300毫秒后才设置为可用
            btnLogin->setEnabled(true);

            QString intelenum=telenum->text();

            string num=intelenum.toStdString();
            bool flag=compat(num);
            qDebug()<<flag<<endl;

            if(intelenum=="11111111111")
            {
                //场景转换
                //隐藏当前窗口
                this->hide();

                //显示第二个窗口 银行职员菜单页
                this->bSMM.show();
            }
            else if(flag)
            {
                int general=rand()%11;
                int vip=rand()%11;

                if(stateVipGeneral==1)
                {
                    cout<<"mu==NULL ="<<(mu==NULL)<<endl;//mu==NULL =0
                    mu=new menu(this);

                    QObject::connect(this,SIGNAL(sendStr(QString)),mu,SLOT(getStr(QString)));
                    emit this->sendStr(intelenum);

                    cout<<"333333"<<endl;

                    //场景转换
                    //隐藏当前窗口
                    this->hide();
                    //显示第二个窗口 menu菜单页
                    mu->show();
                }
                else
                {
                    QMessageBox::about(this, tr("排队"), "您为普通用户,当前您前面还有"+QString::number(general+vip)+"人,请耐心等待!");
                    QTimer::singleShot(2500+(general+vip)*10,[=](){
                        mu=new menu(this);

                        QObject::connect(this,SIGNAL(sendStr(QString)),mu,SLOT(getStr(QString)));
                        emit this->sendStr(intelenum);

                        //场景转换
                        //隐藏当前窗口
                        this->hide();
                        //显示第二个窗口 menu菜单页
                        mu->show();
                    });
                }
            }
            else
                QMessageBox::about(this, tr("ERROR"), tr("输入手机号错误!请重新输入或注册!"));
        });
    });

    //注册按钮
    bankregisterbutton *btnregister=new bankregisterbutton(this);
    btnregister->resize(60,60);

    btnregister->move(this->width()*1/4-btnLogin->width()*1/4,this->height()*2/5-btnLogin->height()/5);

    connect(btnregister,&bankPushButton::clicked,[=](){
        //虽然向右动画播放完成之后才会启用向左的动画
        //但是若一直点击,时间差在150毫秒以内,很可能会出现向左动画覆盖向右动画
        //所以通过设置按钮的可不可用来防止多次连续点击
        //将按钮设置为不可用
        btnregister->setEnabled(false);

        //播放向右
        btnregister->moveright();

        //QTimer相当于一个定时器
        //150为时间
        //后面的lamda表达式为槽
        QTimer::singleShot(150,[=](){
            //播放向左
            //向右的动画需要100毫秒才能播放完成
            //而此处调用的向左走的动画会等不及向右走的动画播放完成就会播放
            //导致了向左走的动画覆盖了向右走的动画
            btnregister->moveleft();
        });

        QTimer::singleShot(300,[=](){
            //300毫秒后才设置为可用
            btnregister->setEnabled(true);

            //场景转换
            //隐藏当前窗口
            this->hide();
            //显示第二个窗口 menu菜单页
            this->ln_rg.show();
        });
    });

}

login.h

#ifndef LOGIN_H
#define LOGIN_H

#include <QWidget>
#include <QString>

#include <iostream>
#include <string>

#include "bank_widget.h"
#include "menu.h"
#include "login_register.h"
#include "bank_stuff.h"
#include "bank_staff_manage_menu.h"

using namespace std;

class login : public Bank_Widget
{
    Q_OBJECT
public:
    explicit login(QWidget *parent = nullptr);

    //void classIsOver();

signals:
    void sendStr(QString);

public slots:

private:
    menu *mu;
    //menu mu;
    login_register ln_rg;
    bank_Staff_Manage_Menu bSMM;
};

#endif // LOGIN_H

  • 写回答

1条回答 默认 最新

  • 胖墩墩的小火苗子 2022-12-22 00:46
    关注

    大概扫了一眼,mu应该只会new一遍吧,估计没有内存问题;
    应该也不是窗口显示问题,你把this->hide()和mu->show()换个位置试试,看看还有问题不;
    还想到一个思路就是,是不是lambda表达式的问题,你可以把SingleShot后边的lambda表达式里边的内容专门写一个函数,不用lambda表达式,会不会好;
    具体哪里的问题,没看出来^_^

    评论

报告相同问题?

问题事件

  • 创建了问题 12月21日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现