我是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
可以解决该问题。也许解决方案是类似的技巧。感谢您的帮助。
答案 0 :(得分:1)
我假设您在size
类中没有(拥有)GameWindow
成员。
如果是,则您要向QWidget's大小为int
的成员分配QSize
。我希望编译器会抱怨,但是我不知道您的标头看起来很难分辨。
如果您在int size
中有一个GameWindow
成员也可能是原因,因为QWidget
已经有一个具有该名称的成员...