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);
}

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);
}
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 に答える