Qt程序无故意外完成

时间:2019-06-07 03:04:28

标签: c++ qt crash

我是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 个答案:

答案 0 :(得分:1)

我假设您在size类中没有(拥有)GameWindow成员。

如果是,则您要向QWidget's大小为int的成员分配QSize。我希望编译器会抱怨,但是我不知道您的标头看起来很难分辨。

如果您在int size中有一个GameWindow成员也可能是原因,因为QWidget已经有一个具有该名称的成员...