【问题标题】:Segmentation fault (core dumped) in qt C++ command line code [closed]qt C++ 命令行代码中的分段错误(核心转储)[关闭]
【发布时间】:2020-04-12 00:46:59
【问题描述】:

我在运行 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 的目录中,并在终端中运行这些命令:

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

我收到此错误:

分段错误(核心转储)

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

这段代码有什么问题?

【问题讨论】:

  • btn1 = ...; btn1 = ...; btn1 = ...; 等复制粘贴错误?
  • @Someprogrammerdude 谢谢.. 看着屏幕有点沮丧,这就是为什么没有看到。非常感谢... :)
  • @Omkar 使用member inizialize list 而不是在构造函数体内分配变量,它会帮助您避免此类错误,而不是提高效率。

标签: c++ c qt


【解决方案1】:

你反复写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  *");     
}

这个例子也避免了手动内存管理。

【讨论】:

  • 使用 的想法很棒,但它会产生很多错误。也许我必须改变业务逻辑。但感谢您之前的回答。
  • 是的,std::vector 可能不行,改成std::list
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2012-11-20
相关资源
最近更新 更多