我创建了一个类,我想将这个类添加到另一个类中(两者都是布局),但我收到的唯一错误消息是程序崩溃了。
我觉得有一些明显的逻辑缺陷,但我没有找到它,我可以分别显示它们,但当我尝试将一个添加到另一个时,程序崩溃了。这是代码:
测量.h:
class Mesure : public QWidget
{
public:
Mesure(QString angle);
private:
QToolButton *m_buttonClose;
QHBoxLayout *m_hlayoutMesure;
QCheckBox *m_checkboxMesure;
QLabel *m_labelAngle;
};
测量.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();
}
编辑: 问题解决了,我只需修改文件如下:
测量.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);
}
最佳答案
在构造函数中,您创建隐藏类成员的局部变量。您将指向已分配元素的指针存储在这些局部变量中,但实际的类变量保持默认初始化(即它们包含垃圾)。
当访问这些垃圾值时(正如您在 PanneauMesure::add
中所做的那样),您最终会出现未定义的行为,这次是崩溃(幸运的是!)
作为旁注,您可能应该使用初始化列表来初始化类变量,如下所示:
Mesure::Mesure(QString angle):
QWidget(),
m_hlayoutMesure(new QHBoxLayout(this)), // always use parented constructor
// when available in Qt
// ...
{
// logic
}
此外,您不需要重复调用 setLayout
。
关于c++ - 将一个类布局添加到另一个类布局: "The program has unexpectedly finished.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10900538/