qt C++命令行代码中的分段错误(核心转储)

Segmentation fault (core dumped) in qt C++ command line code

本文关键字:错误 核心 转储 分段 C++ 命令行 代码 qt      更新时间:2023-10-16

我在运行Qt-C++程序时遇到分段错误:

dlg.h

#include<QGridLayout>
#include<QPushButton>
#include<QDialog>
class dlg : public QDialog{
private:
QPushButton *btn1,*btn2,*btn3,*btn4,*btn5,*btn6,*btn7,*btn8,*btn9,*btn10,*btn11,*btn12;
QGridLayout *gridlayout;
public:
dlg();
};

dlg.cpp

#include "dlg.h"
dlg::dlg(){
btn1 = new QPushButton("btn1");
btn1 = new QPushButton("btn2");
btn1 = new QPushButton("btn3");
btn1 = new QPushButton("btn4");
btn1 = new QPushButton("btn5");
btn1 = new QPushButton("btn6");
btn1 = new QPushButton("btn7");
btn1 = new QPushButton("btn8");
btn1 = new QPushButton("btn9");
btn1 = new QPushButton("btn10");
btn1 = new QPushButton("btn11");
btn1 = new QPushButton("btn12");
gridlayout = new QGridLayout(this);

gridlayout->addWidget(btn1,0,0);
gridlayout->addWidget(btn2,0,1);
gridlayout->addWidget(btn3,0,2);
gridlayout->addWidget(btn4,0,3);
gridlayout->addWidget(btn5,1,0);
gridlayout->addWidget(btn6,1,1);
gridlayout->addWidget(btn7,1,2);
gridlayout->addWidget(btn8,1,3);
gridlayout->addWidget(btn9,2,0);
gridlayout->addWidget(btn10,2,1);
gridlayout->addWidget(btn11,2,2);
gridlayout->addWidget(btn12,2,3);
setLayout(gridlayout);
setWindowTitle("* QGridLayout  *");     
}

main.cpp

#include<iostream>
#include<QApplication>
#include "dlg.h"
using namespace std;
int main(int argc,char** argv){
QApplication app(argc,argv);
dlg obj;
obj.show();
return app.exec();
}

我将所有文件保存在名为gridlayout的目录中,并在终端中运行了这些 comamnds:

cd /hom/gridlayout/
qmake -project
qmake gridlayout.pro
make

我收到此错误:

分段故障(核心转储(

有没有人可以解决这个问题。我指的是Jeganathan Swaminathan的《掌握C++编程》这本书,用于Qt命令行C++编码。

这段代码有什么问题?

你反复写btn1.你可能的意思是btn1btn2,...考虑使用std::list(因为 GUI 元素可能无法复制(和循环,而不是一遍又一遍地复制粘贴同一行:

class dlg : public QDialog{
private:
std::list<QPushButton> buttons;
QGridLayout gridlayout;
public:
dlg();
};
dlg::dlg() : gridlayout (this) {
for (std::uint_fast8_t x = 0; x < 3; ++x) {
for (std::uint_fast8_t y = 0; y < 4; ++y) {
gridlayout.addWidget (buttons.emplace_back ("btn" + std::to_string(x*4+y)), x, y);
}
}
setLayout(gridlayout);
setWindowTitle("* QGridLayout  *");     
}

此示例还避免了手动内存管理。