2017-03-31 24 views
0

私はQtのに比較的新しいです戻り、私は彼らが読んclicked.I'veいるとき、それぞれが特定の値を返す別のボタンを持っているかを把握しようとこだわっています信号とスロットについてはQtのドキュメントを使っていましたが、何か有用なものは見つかりませんでした。持っているどのように複数のQtのボタンは、それぞれ異なる値が

私はちょうどクリックされた関数を使用して、 "goto slots"を使って値を返すことができますが、メインからは、ユーザーがクリックすると、後で使用できる対応するintが返されます。このようなものは、それがメインからどのように見えるかです。

OptionMenuWindow option; 
int choice = option.checkChoice(); 

これはOptionMenuWindowクラスで私のコードであるとchoice0Clickedが活性化されたとき、私はクリックされたボタンを知っているように、私はスロットを介して基準としてint型を渡して試してみました。

int OptionMenuWindow::checkChoice(){ 

this->show(); 
QEventLoop waitForResponse; 

//THIS IS WHERE I TRY AND DO THAT 
connect(ui->manageEmployee, SIGNAL (clicked()), &waitForResponse, SLOT(choice0Clicked())); 

connect(ui->view, SIGNAL (clicked()), &waitForResponse, SLOT(choice1Clicked())); 

connect(ui->generatePayroll, SIGNAL (clicked()), &waitForResponse, SLOT(choice2Clicked())); 

waitForResponse.exec(); 

cout << "here" << endl 
cout << choice << endl; 
return choice; 

} 
void OptionMenuWindow::choice0Clicked() 
{ 
    choice = 0; 

} 

void OptionMenuWindow::choice1Clicked() 
{ 
    choice = 1; 
} 

void OptionMenuWindow::choice2Clicked() 
{ 
    choice = 2; 
} 

選択肢がヘッダーファイルで定義されています。

これは私が取得していますエラーです:

のQObjectを::接続:いいえ、そのようなスロットQEventLoopを:: choice0Clicked(&選択)

のQObject ::接続:(差出人名:「manageEmployee 「)

のQObject ::接続:そのようなスロットQEventLoop :: choice1Clicked(&選択は)

のQObject ::接続しない:(送信者名を 'ビュー')

のQObject ::接続:いいえ、そのようなスロットQEventLoopを:: choice2Clicked(&選択)

のQObject ::接続:(差出人名: 'generatePayroll')

私は実際にそこにあると信じて誰かがそれを説明してもらえますか?

もし私に詳しいことが必要なものがあれば、コメントにそれを教えてください。

ありがとうございました

+0

シグナルのシグネチャは、接続されたスロットのシグネチャと一致する必要があります(https://doc.qt.io/qt-5/signalsandslots.html#signals-and-slots)。 [Qtの例](https://doc.qt.io/qt-5/gettingstartedqt.html)に従ってみて、ボタンがクリックされたときにどのように処理されるかを確認してください。 – Mike

答えて

0

スロットを過負荷にすることはできません。それはシグナルのシグネチャと一致する必要があります。

これは、ボタンのインデックスに来て、この唯一

QObject::connect(ui->manageEmployee, SIGNAL (clicked()), &waitForResponse, SLOT(choice0Clicked())); 

QObject::connect(ui->view, SIGNAL (clicked()), &waitForResponse, SLOT(choice1Clicked())); 

QObject::connect(ui->generatePayroll, SIGNAL (clicked()), &waitForResponse, SLOT(choice2Clicked())); 

のようなものでなければなりません

私たちはあなたがプッシュボタンを持っていると仮定しましょう - 「ボタン1」、「button2を」と「ボタン3を」 。

"QButtonGroup"オブジェクトを作成します。

QButtonGroup *bGroup = new QButtonGroup(); 

すべてのボタンをIDで追加します。ボタンのIDを取得するためのスロットで今

bGroup->addButton(button1, 0); 
bGroup->addButton(button2, 1); 
bGroup->addButton(button3, 2); 

void OptionMenuWindow::choice0Clicked() 
{ 
     QPushButton* button = qobject_cast<QPushButton*>(sender());   
     int buttonID = bGroup->id(button);  
} 

void OptionMenuWindow::choice1Clicked() 
{ 
    QPushButton* button = qobject_cast<QPushButton*>(sender());  
    int buttonID = bGroup->id(button); 
} 

void OptionMenuWindow::choice2Clicked() 
{ 
    QPushButton* button = qobject_cast<QPushButton*>(sender());  
    int buttonID = bGroup->id(button); 
} 
+0

'QPushButton :: id () 'を返します。最後の段落で何を話そうとしていますか? – Mike

+0

私は申し訳ありませんが、intを返すことになっているchoiceChecker関数int int intがあります。この場合、どのintが返されますか? –

+0

@ismailyussuf、なぜintを返す必要がありますか? 'OptionMenuWindow'クラスのメンバとして宣言されているだけです(クリックされたボタンの状態を保存したい場合)、クリックされたボタンに従ってそのintを操作してください。 「クリックされた」信号に接続されたスロットでGUI操作を行うことができます(ユーザーにフィードバックを表示するため)。 。 。 – Mike

0

あなたはQSignalMapperを使用することができます。 Qtのアシスタントから

このクラスは、パラメータなしの信号のセットを収集し、整数、文字列または信号を送信したオブジェクト に対応するウィジェットパラメータで それらを再放出する

signalMapper = new QSignalMapper(this); 

    for (int i = 0; i < texts.size(); ++i) { 
     QPushButton *button = new QPushButton(texts[i]); 
     connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
     signalMapper->setMapping(button, texts[i]); 
    } 

    connect(signalMapper, SIGNAL(mapped(QString)), 
      this, SIGNAL(clicked(QString)));