[英]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.当您创建
QVBoxLayout
或QHBoxLayout
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.