简体   繁体   English

设置布局上的 Qt 分段错误

[英]Qt segmentation fault on setlayout

I'm trying to creat a Settings panel which inherits from QWidget.我正在尝试创建一个继承自 QWidget 的设置面板。 However, when it shows, it receive SIGSEV from my system because of Segmentation fault.但是,当它显示时,由于分段错误,它从我的系统接收到 SIGSEV。 Here is my code:这是我的代码:

//settings.h //设置.h

#ifndef SETTINGS_H
#define SETTINGS_H
#include <QWidget>
class QRadioButton;
class QGroupBox;
class QPushButton;
class QEventLoop;
class Settings : public QWidget {
    Q_OBJECT
public:
    explicit Settings(QWidget* parent = nullptr);
    void doExec();
    void doClose();
private:
    QEventLoop* eventloop;
    QGroupBox* windowGroupBox;
    QRadioButton* normalRadioButton;
    QRadioButton* fullscreenRadioButton;
    QPushButton* closePushButton;
};
#endif // SETTINGS_H

//settings.cpp //settings.cpp

#include "settings.h"
#include <QEventLoop>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QPushButton>
#include <QRadioButton>
#include <QVBoxLayout>
Settings::Settings(QWidget* parent) : QWidget(parent) {
    eventloop = new QEventLoop;
    setAttribute(Qt::WA_DeleteOnClose);
    setWindowFlag(Qt::FramelessWindowHint);
    windowGroupBox = new QGroupBox(tr("window"));
    normalRadioButton = new QRadioButton(tr("normal"));
    fullscreenRadioButton = new QRadioButton(tr("fullscreen"));
    QHBoxLayout* hlayout = new QHBoxLayout;
    hlayout->addWidget(normalRadioButton);
    hlayout->addWidget(fullscreenRadioButton);
    windowGroupBox->setLayout(hlayout);
    closePushButton = new QPushButton(tr("close"));
    connect(closePushButton, &QPushButton::click, this, &Settings::doClose);
    QVBoxLayout* vlayout = new QVBoxLayout;
    vlayout->addItem(hlayout);
    vlayout->addWidget(closePushButton);
    resize(200, 100);
    setLayout(vlayout); // segemtation fault
}
void Settings::doExec() { eventloop->exec(); }
void Settings::doClose() {
    eventloop->exit();
    close();
}

I think that all of the objects are created on heaps.我认为所有的对象都是在堆上创建的。 Why is this still happen?为什么还会出现这种情况?

I'm not 100% sure why calling setLayout() causes a crash, but I do know that there is a better way to construct your GUI that doesn't require calls to setLayout() .我不是 100% 确定为什么调用setLayout()会导致崩溃,但我知道有一种更好的方法来构建不需要调用setLayout()的 GUI。 Instead of calling setLayout() , when you create a QVBoxLayout or QHBoxLayout object, pass in a pointer to the QWidget you want it to manage, as an argument to its constructor.当您创建QVBoxLayoutQHBoxLayout object 时,不要调用setLayout() ,而是将指向您希望它管理的QWidget的指针作为其构造函数的参数传递。

For example, this slightly modified version of your code runs without crashing:例如,您的代码的这个稍作修改的版本运行时不会崩溃:

Settings::Settings(QWidget* parent) : QWidget(parent) {
    eventloop = new QEventLoop;
    setAttribute(Qt::WA_DeleteOnClose);
    setWindowFlag(Qt::FramelessWindowHint);
    windowGroupBox = new QGroupBox(tr("window"));
    normalRadioButton = new QRadioButton(tr("normal"));
    fullscreenRadioButton = new QRadioButton(tr("fullscreen"));
    QHBoxLayout* hlayout = new QHBoxLayout(windowGroupBox);   // <<<<<<<< NOTE 
    hlayout->addWidget(normalRadioButton);
    hlayout->addWidget(fullscreenRadioButton);
    closePushButton = new QPushButton(tr("close"));
    connect(closePushButton, &QPushButton::click, this, &Settings::doClose);
    QVBoxLayout* vlayout = new QVBoxLayout(this);   // <<<<<<<< NOTE
    vlayout->addItem(hlayout);
    vlayout->addWidget(closePushButton);
    resize(200, 100);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM