2012-06-05 3 views
2

클래스를 만들었으므로이 클래스를 다른 클래스에 추가하고 싶습니다. 둘 다 레이아웃이지만, 오류 메시지는 프로그램이 충돌한다는 것입니다.다른 클래스 레이아웃에 클래스 레이아웃 추가 : "프로그램이 예기치 않게 끝났습니다."

명백한 논리 결함이있는 것처럼 느껴지지만 찾지 못했습니다. 둘 다 별도로 표시 할 수 있지만 다른 하나를 추가하려고하면 프로그램이 충돌합니다.

Mesure.h :

class Mesure : public QWidget 
{ 
    public: 
    Mesure(QString angle); 

    private: 
    QToolButton *m_buttonClose; 
    QHBoxLayout *m_hlayoutMesure; 
    QCheckBox *m_checkboxMesure; 
    QLabel *m_labelAngle; 
}; 

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); 
} 
여기에 코드입니다,210

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

관련 문제