簡體   English   中英

設置布局上的 Qt 分段錯誤

[英]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。 當您創建QVBoxLayoutQHBoxLayout 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM