2012-06-05 49 views
2

我创建了一个类,我想在另一个类中添加这个类(都是布局),但我得到的唯一错误信息是程序崩溃。将班级布局添加到其他班级布局:“程序意外完成。”

我觉得有一些明显的逻辑缺陷,但我没有找到它,我可以单独显示他们两个,但是当我尝试添加一个到另一个程序崩溃。下面是代码:

Mesure.h:

​​

Mesure.cpp:

Mesure::Mesure(QString angle) : QWidget() 
{ 
    QHBoxLayout *m_hlayoutMesure = new QHBoxLayout; 
    QCheckBox *m_checkboxMesure = new QCheckBox(this); 
    QToolButton *m_buttonClose = new QToolButton(this); 
    QLabel *m_labelAngle = new QLabel(angle, this); 

    m_buttonClose->setText("X"); 

    m_hlayoutMesure->addWidget(m_checkboxMesure); 
    m_hlayoutMesure->addWidget(m_labelAngle); 
    m_hlayoutMesure->addWidget(m_buttonClose); 

    setLayout(m_hlayoutMesure); 
} 

PanneauMesure.h:

class PanneauMesure : public QWidget 
{ 
    public: 
    PanneauMesure(); 
    void add(Mesure *mesure); 

    private: 
    QVBoxLayout *m_vlayoutMesures; 
}; 

PanneauMesure.cpp:

PanneauMesure::PanneauMesure() : QWidget() 
{ 
    QVBoxLayout *m_vlayoutMesures = new QVBoxLayout; 
    setLayout(m_vlayoutMesures); 
} 

void PanneauMesure::add(Mesure *mesure) 
{ 
    m_vlayoutMesures->addWidget(mesure); 
    setLayout(m_vlayoutMesures); 
} 

main.cpp中:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    PanneauMesure panneau; 
    Mesure mesure("14°"); 
    panneau.add(&mesure); 

    return app.exec(); 
} 

编辑: 问题解决了,我不得不修改这些文件是这样的:

Mesure.cpp:

Mesure::Mesure(QString angle) : QWidget(), 
    m_hlayoutMesure(new QHBoxLayout(this)), 
    m_checkboxMesure(new QCheckBox(this)), 
    m_buttonClose(new QToolButton(this)), 
    m_labelAngle(new QLabel(angle, this)) 
{ 
    m_buttonClose->setText("X"); 

    m_hlayoutMesure->addWidget(m_checkboxMesure); 
    m_hlayoutMesure->addWidget(m_labelAngle); 
    m_hlayoutMesure->addWidget(m_buttonClose); 

    setLayout(m_hlayoutMesure); 
} 

PanneauMesure.cpp:

PanneauMesure::PanneauMesure() : QWidget(), 
    m_vlayoutMesures(new QVBoxLayout(this)) 
{ 
    setLayout(m_vlayoutMesures); 
} 

void PanneauMesure::add(Mesure *mesure) 
{ 
    m_vlayoutMesures->addWidget(mesure); 
    setLayout(m_vlayoutMesures); 
} 

回答

3

在你的构造函数中,你创建了l隐藏你的类成员的ocal变量。您将指向分配元素的指针存储在这些局部变量中,但实际的类变量保留默认初始化(即它们包含垃圾)。

当访问这些垃圾值(如你在PanneauMesure::add做),你最终有不确定的行为,这个时候崩溃(你真幸运!)

一点题外话,你应该使用初始化列表来初始化类变量如下:

Mesure::Mesure(QString angle): 
    QWidget(), 
    m_hlayoutMesure(new QHBoxLayout(this)), // always use parented constructor 
              // when available in Qt 
    // ... 
{ 
    // logic 
} 

此外,您不需要重复呼叫setLayout

+0

非常感谢。我做了你所说的,现在它很好用:) – Leo