2017-07-07 11 views
0

QWizardを作成しています。いくつかのQWizardPagesでは、QWizardPageがQWizardでいくつかのプロパティを設定できるように、コンストラクタでコールバックメソッドを提供します。そのようコンボボックス信号をQtのstd ::関数に接続する際の問題

は:にQLineEditに押されたときに入力しBWizardPage1

BWizard::BWizard(QWidget *parent, t::WindowFlags): QWizard(parent, f), modelCheckedOut(false), selectedB(0){ 
    // Setup UI and add pages to wizard. 
    ui.setupUi(this); 
    // Make callbacks to set data onto Wizard instead of pages. 
    auto makeLastPage = [this]() 
    { 
    int pageId = this->pageIds().last(); 
    this->removePage(pageId); 
    this->modelCheckedOut = true; 
    }; 
    auto setB = [this](int b) 
    { 
    this->selectedB = b; 
    }; 
    addPage(new BWizardPage1(setB, this)); 
    addPage(new BWizardPage2(makeLastPage, this)); 
    addPage(new BWizardPage3(this)); 
} 

私はsetB関数を使用します。私はBWizardPage1のコンストラクタでこれをバインドします。これは正常に動作します:コンボボックスが変更されたとき、私はmakeLastPage機能を使用

QObject::connect(ui.searchField, &QLineEdit::returnPressed, this, [&]() { 
    setB(5); 
} 

BWizardPage2に。私はBWizardPage2のコンストラクタでこれをバインドします。コンボボックスが変更されると、makeLastPageは空(またはヌル)のように見えます。

QObject::connect(ui.comboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [&](int index) { 
    makeLastPage(); 
} 

誰でも私が間違っていることを教えてもらえますか?私は、参照によってmakeLastPageをキャプチャすることによりstd::function<void(void)> makeLastPagestd::function<void(int)> setB

答えて

2
QObject::connect(ui.comboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [&](int index) { 
    makeLastPage(); 
} 

としての機能を渡し、あなたは関数のパラメータへの参照を取得しています。これは、関数が返った後にスコープの外に出て、ぶら下がっている参照を残します。代わりに、値でmakeLastPageをキャプチャしてください。

QObject::connect(ui.comboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [=](int index) { 
    makeLastPage(); 
} 
+0

これは意味があります。しかし、なぜこれは 'BWizardPage1'の' setB'では起こりませんか? – Mads

+0

おそらく、未定義の動作であるためです。定義されていない動作を引き起こすときに起こることの1つは、意図したとおりに実際に動作することです。それ以上のコードなしで伝えるのは難しいです。 –

関連する問題