2

我创建了一个类,我想在另一个类中添加这个类(两者都是布局),但我得到的唯一错误消息是程序崩溃了。

我觉得有一些明显的逻辑缺陷,但我没有找到,我可以分别显示它们,但是当我尝试将一个添加到另一个时,程序崩溃了。这是代码:

测量.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);
}

主.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);
}
4

1 回答 1

3

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

PanneauMesure::add当访问这些垃圾值时(就像你在

作为旁注,您可能应该使用初始化列表来初始化您的类变量,如下所示:

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

此外,您不需要setLayout重复调​​用。

于 2012-06-05T15:58:55.927 回答