2016-11-11 24 views
1

こんにちは、私はQtシーンが新しく、comboBox1の選択に基づいてcomboBox2を更新するのに問題があります。Qt ComboBox1に基づいてComboBox2を変更してください

いつも私はcomboBox1に変更を加えると、私のアプリケーションがクラッシュし、アクセス違反と言っていました。これはおそらく非常に簡単ですが、私のコードは次のとおりです。この場合、最初のcomboBox1には "Car"と "Food"があります。私が「食べ物」に切り替えるたびに、私はcomboBox2が項目「卵」を埋めるようにしたい。

何が問題になりましたか?

main.h

class main: 
{ 
    Q_OBJECT 


public: 
    main() {} 

    public slots : 

    private slots: 
     void onComboBoxIndexChanged(); 

private: 
    QComboBox* comboBox2; 
    void run(); 
}; 

main.cppに

void main::run() 
{ 
QWidget *w = new QWidget(); 

QComboBox *comboBox1 = new QComboBox(); 
QComboBox *comboBox2 = new QComboBox(); 

comboBox1->addItem("Car"); 
comboBox1->addItem("Food"); 

connect(comboBox1, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged())); 
... 
} 


void main::onComboBoxIndexChanged() 
{ 
QComboBox* combo = dynamic_cast<QComboBox*>(sender()); 

if (combo == nullptr) 
{ 
    return; 
} 

comboBox2->addItem("Egg"); 

} 
+0

あなたは新しい 'QComboBox'オブジェクトを' run'関数のローカル変数に割り当てているようです。おそらく、それをメンバー 'comboBox2'に割り当てることを意図していました。 – Mike

+0

ちょっと@ミークそれはタイプミスです。私は実際にcomboBox2に割り当てています。コードに問題がありますか? – Arbitel

答えて

1

あなたは正しく、あなたのタイプミスを修正しませんでした。私が間違って見る3つのことがあります、そして、私は第3のものがこれをコンパイルするのを妨げると思いました。

まず、main.hはあなたのクラス名が "main"だと言っていますが、main.cppではあなたのクラスはWIPGuiです。明らかにそれらのファイルの1つが正しいものではありません。私はあなたの実際のmain.hファイルがWIPGuiクラスを定義していると仮定して処理を進めますが、そうでなければ同じように見えます。

第二に、マイクはあなたの実行機能では、指摘しようとしたとして、あなたがこれを持っている:

あなたの「実行」メソッド内のローカル変数を作成しています
QComboBox *comboBox2 = new QComboBox(); 

。クラスメンバー変数comboBox2に割り当てられていません。何がしたいことは次のとおりです。

comboBox2 = new QComboBox(); 

第三に、あなたのconnect文は、私たちが見ているコードに基づいてコンパイルしないでください。

connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged())); 

「コンボボックス」の変数は、このコードではどこにも存在しません。 。 connectステートメントで実際に "comboBox1"を使用していたのですが、これはここで示したコードの別のタイプミスです。connectステートメントは問題ありません。これがそのままカットアンドペーストされていれば、このコンパイル方法はわかりません。

connectステートメントで "comboBox1"を使用したとすると、実際の問題はメンバー変数 "comboBox2"に決して割り当てられていないということです。スロットで使用しようとするとクラッシュします。

+0

ありがとう!私はコードにもっと多くのものを持っていたので、それを簡略化しなければならなかったので、タイプミス。しかし、第2のポイントはトリック:)マイクは正しかった。私は、ローカルとクラスのメンバ変数と混同しました! – Arbitel

関連する問題