c++ - Adding a class layout to another class layout: "The program has unexpectedly finished." -
i've created class , add class in other 1 (both layouts) error message program crashed.
i feel there obvious logic flaw don't find it, can show both of them separately when try add 1 other program crashes. here code:
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); } main.cpp:
int main(int argc, char *argv[]) { qapplication app(argc, argv); panneaumesure panneau; mesure mesure("14°"); panneau.add(&mesure); return app.exec(); } edit: problem solved, had modify files this:
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); }
in constructors, create local variables hide class members. store pointers allocated elements in these local variables, actual class variables left default-initialized (i.e. contain garbage).
when accessing these garbage values (as in panneaumesure::add) end having undefined behaviour, time crash (lucky you!)
as sidenote, should use initializer lists initialize class variables, this:
mesure::mesure(qstring angle): qwidget(), m_hlayoutmesure(new qhboxlayout(this)), // use parented constructor // when available in qt // ... { // logic } also, don't need call setlayout repeatedly.
Comments
Post a Comment