Программа Qt неожиданно завершилась без причины - PullRequest
0 голосов
/ 07 июня 2019

Я новичок в 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 перед сборкой снова исправляет его. Может быть, решение такого рода уловка, как это. Спасибо за любую помощь.

1 Ответ

1 голос
/ 07 июня 2019

Я предполагаю, что у вас нет (собственного) члена size в классе GameWindow.

Если это так, то вы присваиваете int члену размера QWidget , который имеет тип QSize. Я ожидаю, что компилятор будет жаловаться, но я, поскольку я не знаю, как выглядит ваш заголовок, трудно сказать.

Если у вас есть int size член в GameWindow, что также может быть причиной, так как QWidget уже имеет члена с таким именем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...