c++ - 将一个类布局添加到另一个类布局: "The program has unexpectedly finished."

标签 c++ qt

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

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

测量.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/

相关文章:

c++ - 从标准容器中移动元素是否合法?

c++ - cURL CURLOPT_WRITEFUNCTION 是否从同一线程调用?

c++ - Qt - 重新实现 QIODevice 以实时听到我自己的声音

用于 UI 的 Qt 和用于应用程序逻辑的 Kotlin

c++ - 在 Qt 中处理多个 ui 文件

c++ - LLVM 中的非指针全局变量

c++ - Dijkstra 算法 C++

c++ - 在不阻塞资源的情况下有效地等待标志状态更改?

c++ - 如何在 BlackBerry 10 中将日期格式转换为字符串

c++ - 将 TreeView 链接到 TableView ? [Qt]