簡體   English   中英

qt 切換中央小部件時出現分段錯誤的程序崩潰

[英]qt Program crush with segmentation fault while switching cental widget

我可能嘗試了所有方法,但我只是沒有在這段代碼中看到錯誤。 我做了兩個從 QMainWindow 繼承的 windows:一個帶有 qt 設計器,另一個只是在構造器中。 我正在嘗試根據您按下的按鈕在 MainWindow class 中切換這些 windows。

  1. 登錄窗口.cpp
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();
}

  1. 注冊窗口.hpp
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() { }
  1. 主窗口.cpp
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;
}

我所能說的就是它會切換 windows 無論我做什么啟動 window 並且第二次它在 SEGV 運行時錯誤的插槽中的 setCentralWidget() 行上崩潰。

QMainWindow::setCentralWidget的文檔中:

注意:QMainWindow 擁有小部件指針的所有權並在適當的時候將其刪除。

logWindowregWindow指向的小部件開始無主的生活。 然后你調用goToReg() ,它調用setCentralWidget(regWindow) - 現在主 window 擁有*regWindow 然后你調用goToLog() ,它調用setCentralWidget(logWindow) - 現在主 window 獲得*logWindow的所有權並銷毀*regWindow ,因此regWindow成為一個懸空指針。 下次您嘗試使用它時,程序會表現出未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM