[英]Qt segmentation fault on setlayout
我正在嘗試創建一個繼承自 QWidget 的設置面板。 但是,當它顯示時,由於分段錯誤,它從我的系統接收到 SIGSEV。 這是我的代碼:
//設置.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
#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();
}
我認為所有的對象都是在堆上創建的。 為什么還會出現這種情況?
我不是 100% 確定為什么調用setLayout()
會導致崩潰,但我知道有一種更好的方法來構建不需要調用setLayout()
的 GUI。 當您創建QVBoxLayout
或QHBoxLayout
object 時,不要調用setLayout()
,而是將指向您希望它管理的QWidget
的指針作為其構造函數的參數傳遞。
例如,您的代碼的這個稍作修改的版本運行時不會崩潰:
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.