2

Qtで足を濡らしているところです。ボタンをクリックした後、QlineEditから文字列をプルして、QTextBrowserに追加しようとしています(簡単にするために、エラーチェックのために、現時点で追加されている単語を追加しています)。

プログラムが実行され、GUIが画面に表示されますが、ボタンをクリックするたびに、プログラムのセグメンテーション違反が発生します。

これが私のコードです、私は不必要なものをたくさん切り取りました:

ヘッダ:

#ifndef TCD2_GUI_H
#define TCD2_GUI_H
//bunch of includes

class TCD2_GUI : public QWidget
{
    Q_OBJECT

public:
     TCD2_GUI(QWidget *window = 0);
     //bunch of other members
     QLineEdit *a1_1;
     QTextBrowser *stdoutput;

public slots:
     void applySettings(void);

private:

};
#endif // TCD2_GUI_H

そしてここに障害を引き起こすcppのスニペットがあります

 QTextBrowser *stdoutput = new QTextBrowser();

    stdoutput->append("Welcome!");

    QObject::connect(apply, SIGNAL(clicked()), this, SLOT(applySettings()));

    //------------------------------------------------------Standard Output END
    //layout things

}

void TCD2_GUI::applySettings()
{
    stdoutput->append("appended");
}
4

2 に答える 2

3

stdoutputapplySettings()関数ではクラスのメンバーを参照しますTCD2_GUIが、クラッシュが発生するコードの stdoutput はローカル変数です。例によってコンストラクターに追加してみてください:

stdoutput = new QTextBrowser();

コードから次の行を削除します。

QTextBrowser stdoutput = new QTextBrowser();
于 2011-02-07T00:39:48.943 に答える
1

提供されたコードを見ると、stdoutputが2回宣言されていると思います。1 回目は *TCD2_GUI* クラスのメンバーとして、2 回目はレイアウトを行うメソッド (クラス コンストラクター?) のローカル変数として。ApplySettingsは、初期化されていないクラス メンバーを使用しているため、セグメンテーション違反です。

コードを次のように変更します。

stdoutput = new QTextBrowser();
stdoutput->append("Welcome!");
QObject::connect(apply, SIGNAL(clicked()), this, SLOT(applySettings()));

問題を解決するかもしれません。

これが役に立てば幸いです、よろしく

于 2011-02-07T00:33:27.427 に答える