Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 切换cental widget时qt程序因分段错误而崩溃_C++_Qt_Qmainwindow - Fatal编程技术网

C++ 切换cental widget时qt程序因分段错误而崩溃

C++ 切换cental widget时qt程序因分段错误而崩溃,c++,qt,qmainwindow,C++,Qt,Qmainwindow,我尝试了所有的方法,但是我没有发现代码中有错误。我从QMainWindow继承了两个窗口:一个使用qt设计器,另一个使用构造函数。我试图在MainWindow类中根据您按下的按钮切换这些窗口 LoginWindow.cpp 注册窗口.hpp MainWindow.cpp MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){ //.hpp中的变量 logWindow=新登录窗口(); regWindow=新注册窗口(); goToR

我尝试了所有的方法,但是我没有发现代码中有错误。我从QMainWindow继承了两个窗口:一个使用qt设计器,另一个使用构造函数。我试图在MainWindow类中根据您按下的按钮切换这些窗口

  • LoginWindow.cpp
  • 注册窗口.hpp
  • MainWindow.cpp
  • MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){
    //.hpp中的变量
    logWindow=新登录窗口();
    regWindow=新注册窗口();
    goToReg();
    连接(logWindow,信号(confirmButton_clicked()),此,插槽(goToReg());
    连接(regWindow,信号(confirButton_clicked()),此,插槽(goToLog());
    }
    void主窗口::goToReg(){
    qDebug()大小());
    qDebug()来自
    QMainWindow::setCentralWidget

    注意:QMainWindow拥有小部件指针的所有权,并在适当的时候将其删除


    logWindow
    regWindow
    的小部件指向无主生命。然后调用
    goToReg()
    ,调用
    setCentralWidget(regWindow)
    ——现在主窗口拥有
    *regWindow
    。然后调用
    goToLog()
    ,调用
    setCentralWidget(logWindow)
    -现在主窗口拥有了
    *logWindow
    的所有权,并且破坏了
    *regWindow
    ,因此
    regWindow
    变成了一个悬空的指针。下次您尝试使用它时,程序会显示未定义的行为。

    那么我如何在代码中完全避免这种行为?我是否在plac中创建这些小部件e?但如果构造和删除是一个性能问题,我如何防止qt删除指针?mb shared_ptr会有帮助吗?请在
    setCentralWidget()之前调用
    takeCentralWidget()
    ,好的,我最好先看一下文档。非常感谢。
    LoginWindow::LoginWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::LoginWindow) {
        ui->setupUi(this);
    }
    
    LoginWindow::~LoginWindow() {
        delete ui;
    }
    
    
    void LoginWindow::on_confirmButton_clicked() {
        emit confirmButton_clicked();
    }
    
    
    RegistrationWindow::RegistrationWindow(QWidget* parent): QMainWindow(parent) {
    
        label = new QLabel("Fast Typing"); //variable in .hpp
        label->setAlignment(Qt::AlignCenter);
        label->setFont(QFont("Lucida Console", 12, 2));
        QVBoxLayout * l = new QVBoxLayout();
        l->addWidget(label);
        l->addWidget(new QLabel("Login", this));
        l->addWidget(new QLineEdit(this));
        l->addWidget(new QLabel("Password", this));
        l->addWidget(new QLineEdit(this));
        p = new QPushButton("Confirm", this); //variable in .hpp
        l->addWidget(p);
        w = new QWidget(); //variable in .hpp
        w->setLayout(l);
        setCentralWidget(w);
    
        connect(p, &QPushButton::clicked, this, &RegistrationWindow::on_confirmButton_clicked);
    }
    
    void RegistrationWindow::on_confirmButton_clicked() {
        emit confirmButton_clicked();
    }
    
    RegistrationWindow::~RegistrationWindow() { }
    
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
        //variables in .hpp
        logWindow = new LoginWindow();
        regWindow = new RegistrationWindow();
        goToReg();
    
        connect(logWindow, SIGNAL(confirmButton_clicked()), this, SLOT(goToReg()));
        connect(regWindow, SIGNAL(confirmButton_clicked()), this, SLOT(goToLog()));
    }
    
    void MainWindow::goToReg() {
        qDebug() << "goToReg";
        resize(regWindow->size());
        qDebug() << "goToReg";
        setCentralWidget(regWindow);
        setWindowTitle("Registration");
        qDebug() << "registration: " << regWindow;
        qDebug() << "login: " << logWindow;
    }
    
    void MainWindow::goToLog() {
        qDebug() << "goToLog";
        resize(logWindow->size());
        qDebug() << "goToLog";
        setCentralWidget(logWindow);
        setWindowTitle("Login");
        qDebug() << "registration: " << regWindow;
        qDebug() << "login: " << logWindow;
    }