Я новичок в Qt и пытаюсь сделать свое первое приложение Qt. Я обнаружил, что я получаю «программа неожиданно завершила» ошибка без видимой причины для меня. Я закомментировал весь код и посткомментировал их построчно, и, похоже, только некоторые строки моего кода генерируют эту ошибку. Я не могу понять, почему это происходит.
У меня есть главное окно, которое прекрасно работает. Все раскладки и соединения работают и т. Д. Когда я нажимаю определенную кнопку, открывается новое окно. Это окно также отлично работает. При нажатии определенной кнопки открывается третье окно. Вот в чем проблема. Без видимой причины определенные линии создают проблемы. У меня есть объект вертикальной компоновки, и когда я пытаюсь addLayout(layout_horizontal)
, я получаю неожиданную ошибку завершения. В следующей строке после этого я добавляю компоновку сетки без проблем и могу добавить две кнопки к горизонтальной компоновке без проблем. Почему мой addLayout(layout_horizontal)
не работает, а addLayout(layout_grid)
работает?
Я делаю button[i][j] = new QPushButton(this)
, и это также вызывает ту же ошибку. Это не проблема с моими указателями, потому что один и тот же код прекрасно работает в моей среде XCode.
Что меня больше всего беспокоит, так это то, что моя строка this->size = size
вызывает эту неожиданную ошибку завершения! У меня есть частный размер int, объявленный в моем заголовке, а затем в конструкторе есть параметр int size. Почему это назначение привело к неожиданному завершению моей программы? Это, кажется, не имеет никакого смысла для меня.
И даже более того, если я скопирую все свои файлы .h
и .cpp
и вставлю их в другой проект Qt в другую папку, код работает отлично. Нет неожиданного конца. Ничего такого.
Может ли быть, что мой проект как-то поврежден? Или в среде разработки Qt есть ошибка, из-за которой этот код компилируется неправильно и вызывает ошибку во время выполнения?
Я так растерялся и разочарован, потому что мой код должен работать, но это не так.
Я приложил код ниже.
Этот код отлично работает
GameWindow::GameWindow(int size, QWidget *previous) : QWidget() {
this->previous = previous;
int button_size = 0;
switch (size) {
case 10:
button_size = 50;
break;
case 20:
button_size = 35;
break;
case 30:
button_size = 30;
break;
}
//this->size = size; NOTICE THIS LINE IS COMMENTED
map = new Button**[size];
button_flag = new QPushButton(tr("&Flag"), this);
button_quit = new QPushButton(tr("&Quit"), this);
layout_grid = new QGridLayout;
layout_vertical = new QVBoxLayout;
layout_horizontal = new QHBoxLayout;
//set up the layout
this->setLayout(layout_vertical);
//layout_vertical->addLayout(layout_horizontal);
layout_vertical->addLayout(layout_grid);
layout_horizontal->addWidget(button_flag);
layout_horizontal->addWidget(button_quit);
layout_grid->setSpacing(0);
//set up buttons
button_flag->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
button_quit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
button_flag->setFixedHeight(50);
button_quit->setFixedHeight(50);
connect(button_quit, SIGNAL(clicked()), this, SLOT(close()));
connect(button_flag, SIGNAL(clicked()), this, SLOT(close()));
for (int i = 0; i < size; i++) {
map[i] = new Button*[size];
for (int j = 0; j < size; j++) {
//map[i][j] = new Button(this);
//map[i][j]->setFixedSize(button_size, button_size);
//layout_grid->addWidget(map[i][j], i, j);
//connect(map[i][j], SIGNAL(clicked()), map[i][j], SLOT(button_clicked()));
}
}
this->setFixedSize(this->minimumWidth(), this->minimumHeight());
initialize_bombs();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
count_neighboring_bombs(i, j);
}
}
}
Этот код неожиданно завершает работу
GameWindow::GameWindow(int size, QWidget *previous) : QWidget() {
this->previous = previous;
int button_size = 0;
switch (size) {
case 10:
button_size = 50;
break;
case 20:
button_size = 35;
break;
case 30:
button_size = 30;
break;
}
this->size = size; //NOTICE THIS LINE IS NO LONGER COMMENTED
map = new Button**[size];
button_flag = new QPushButton(tr("&Flag"), this);
button_quit = new QPushButton(tr("&Quit"), this);
layout_grid = new QGridLayout;
layout_vertical = new QVBoxLayout;
layout_horizontal = new QHBoxLayout;
//set up the layout
this->setLayout(layout_vertical);
//layout_vertical->addLayout(layout_horizontal);
layout_vertical->addLayout(layout_grid);
layout_horizontal->addWidget(button_flag);
layout_horizontal->addWidget(button_quit);
layout_grid->setSpacing(0);
//set up buttons
button_flag->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
button_quit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
button_flag->setFixedHeight(50);
button_quit->setFixedHeight(50);
connect(button_quit, SIGNAL(clicked()), this, SLOT(close()));
connect(button_flag, SIGNAL(clicked()), this, SLOT(close()));
for (int i = 0; i < size; i++) {
map[i] = new Button*[size];
for (int j = 0; j < size; j++) {
//map[i][j] = new Button(this);
//map[i][j]->setFixedSize(button_size, button_size);
//layout_grid->addWidget(map[i][j], i, j);
//connect(map[i][j], SIGNAL(clicked()), map[i][j], SLOT(button_clicked()));
}
}
this->setFixedSize(this->minimumWidth(), this->minimumHeight());
initialize_bombs();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
count_neighboring_bombs(i, j);
}
}
}
Я знаю, что иногда возникают ошибки, но очистка проекта и запуск qmake
перед сборкой снова исправляет его. Может быть, решение такого рода уловка, как это. Спасибо за любую помощь.