【发布时间】: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->sizethis->size将引用QWidget::size()getter 函数,它不能被分配一个int。 -
您需要在调试器下运行您的应用程序。这应该(希望)给你一些关于出了什么问题和原因的提示。
-
我有自己的尺码会员。该行不是唯一产生错误的行。为什么我的添加布局调用产品错误一次但不是其他时间?为什么将代码复制并粘贴到另一个项目时可以工作?有什么想法吗?