【问题标题】:Qt Program has unexpectedly finished for no reasonQt 程序无故意外结束
【发布时间】:2019-06-07 03:04:28
【问题描述】:

我是 Qt 新手,正在尝试制作我的第一个 Qt 应用程序。我发现我收到 “程序意外完成” 错误,对我来说没有明显的原因。我注释掉了所有代码并逐行取消注释,似乎只有我的代码的某些行会产生此错误。我一生都无法理解为什么会发生这种情况。

我有一个运行良好的主窗口。所有的布局和连接都有效,等等。当我单击某个按钮时,它会打开一个新窗口。这个窗口也工作得很好。单击某个按钮时,会打开第三个窗口。这就是问题所在。没有明显的原因,特定的线路正在产生问题。我有一个垂直布局对象,当我尝试addLayout(layout_horizontal) 时,我得到了意外的完成错误。在那之后的下一行,我添加了一个没有问题的网格布局,并且可以毫无问题地向水平布局添加两个按钮。为什么我的addLayout(layout_horizontal) 不起作用而addLayout(layout_grid) 起作用?

我做了一个button[i][j] = new QPushButton(this),这也会产生同样的错误。这不是我的指针的问题,因为相同的代码在我的 Xcode 环境中运行良好。

最让我困惑的是我的this->size = size 行导致了这个意外的完成错误!我在我的标头中声明了一个私有 int 大小,然后在我的构造函数中有一个 int 大小参数。为什么该作业会导致我的程序意外完成?这对我来说似乎毫无意义。

更重要的是,如果我复制我的整个 .h.cpp 文件并将它们粘贴到不同文件夹中的不同 Qt 项目中,则代码可以正常工作。没有意想不到的结局。没有。

会不会是我的项目以某种方式损坏了?还是Qt开发环境有bug导致这段代码编译不正确导致运行时错误?

我很困惑和沮丧,因为我的代码应该可以工作,但它没有。

我附上了下面的代码。

这段代码运行良好

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 会修复它。也许解决方案是某种类似的技巧。感谢您的帮助。

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。虽然我看到您已经注释掉了部分代码,但我们仍然需要查看 minimal reproducible example(头文件,包括 main.cpp)。我猜你是从 QWidget 继承的;除非你有一个size 成员,否则this-&gt;size this-&gt;size 将引用QWidget::size() getter 函数,它不能被分配一个int。
  • 您需要在调试器下运行您的应用程序。这应该(希望)给你一些关于出了什么问题和原因的提示。
  • 我有自己的尺码会员。该行不是唯一产生错误的行。为什么我的添加布局调用产品错误一次但不是其他时间?为什么将代码复制并粘贴到另一个项目时可以工作?有什么想法吗?

标签: c++ qt crash


【解决方案1】:

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

如果是这样,那么您将int 分配给QWidget's 大小成员,其类型为QSize。我希望编译器会抱怨,但我不知道你的标题看起来如何很难说。

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

【讨论】:

  • 也许他需要这样做:this.resize(size, size);
  • 请注意,QWidget::size 实际上不是QSize 类型。相反,它是一个返回类型为QSize 的非静态成员函数,所以它的类型是QSize (QWidget::*)() const
  • 我有自己的 size 成员,正如我在 int 类型问题中所解释的那样。重申一下,我的代码编译得很好,我只是得到一个运行时错误。我还将代码复制并粘贴到另一个项目中,它工作正常,没有运行时错误。这就是为什么我很困惑。如果我的代码有错误,它应该始终是一个错误。但我的似乎只在一个项目中出错,而在其他任何项目中都没有。
  • @mlovick 在这种情况下,我会强烈建议您编辑您的问题以删除冗余代码(即您基本上再次粘贴整个内容的部分,只有这个->size = size 注释掉),而是添加类的标题 - 即正如 TrebledJ 所说:minmal reproducibleexample 的代码。人们试图在自愿的基础上帮助你 - 尽量让他们更容易帮助你(例如,让代码易于阅读)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2013-12-21
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多