qt程序在切换中央小部件时因分段错误而崩溃
qt Program crush with segmentation fault while switching cental widget
我可能尝试了所有方法,但我没有发现此代码中的错误。我从 QMainWindow 继承了两个 windows:一个使用 qt 设计器,另一个仅在构造函数中。我正在尝试根据您按下的按钮在 MainWindow class 中切换这些 windows。
- LoginWindow.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();
}
- RegistrationWindow.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() { }
- MainWindow.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 并且第二次它在插槽中的 setCentralWidget() 行上崩溃并出现 SEGV 运行时错误。
来自 QMainWindow::setCentralWidget
的 the documentation:
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.
logWindow
和 regWindow
指向开始无主生活的小部件。然后你调用 goToReg()
,它调用 setCentralWidget(regWindow)
- 现在主 window 拥有 *regWindow
。然后你调用 goToLog()
,它调用 setCentralWidget(logWindow)
- 现在主要的 window 取得了 *logWindow
的所有权并且 destroys *regWindow
, 所以 regWindow
变成了悬垂指针。下次您尝试使用它时,该程序会出现未定义的行为。
我可能尝试了所有方法,但我没有发现此代码中的错误。我从 QMainWindow 继承了两个 windows:一个使用 qt 设计器,另一个仅在构造函数中。我正在尝试根据您按下的按钮在 MainWindow class 中切换这些 windows。
- LoginWindow.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();
}
- RegistrationWindow.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() { }
- MainWindow.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 并且第二次它在插槽中的 setCentralWidget() 行上崩溃并出现 SEGV 运行时错误。
来自 QMainWindow::setCentralWidget
的 the documentation:
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.
logWindow
和 regWindow
指向开始无主生活的小部件。然后你调用 goToReg()
,它调用 setCentralWidget(regWindow)
- 现在主 window 拥有 *regWindow
。然后你调用 goToLog()
,它调用 setCentralWidget(logWindow)
- 现在主要的 window 取得了 *logWindow
的所有权并且 destroys *regWindow
, 所以 regWindow
变成了悬垂指针。下次您尝试使用它时,该程序会出现未定义的行为。