2017-03-15 9 views
0

私はビジュアルスタジオでQTを使用する方法を学んでいます。現時点ではQT 5.8と2017を使用しています。私は新しいプロジェクトを作成し、QTデザイナーといくつかのラジオボタンを追加しました。さて、「ラジオボタンをクリックするとそうする」のようないくつかのアクションを実装したいと思います。Qtシグナルスロットビジュアルスタジオ:接続されていないようです

Draw.cpp

#include "Draw.h" 

#include "qpushbutton.h" 
#include "qradiobutton.h" 
#include "qgroupbox.h" 

Draw::Draw(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    ui.setupUi(this); 

    //Invisible elements 
    ui.frmAbsolut->setVisible(false); 

    //We create the connections to methods 
    connect(this->ui.myradiobutton1, SIGNAL(toggled(bool)), this, SLOT(on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0))); 

} 

void Draw::on_rdbMethod_change(bool value, int option) 
{ 
    //0: frmAbsolut 
    printf("%d \n", option); 
    if (value == true){ 
     if (option == 0) { 
      this->ui.frmAbsolut->setVisible(true); 
     } 
    } 
} 

Draw.h

#pragma once 

#include <QtWidgets/QMainWindow> 
#include "ui_Draw.h" 

class Draw: public QMainWindow 
{ 
    Q_OBJECT 

public: 
    Draw(QWidget *parent = Q_NULLPTR); 

private: 
    Ui::DrawClass ui; 

protected slots: 
    void on_rdbMethod_change(bool, int); 

}; 

私はプログラムを実行すると、私はすべてのエラーを取得しないと私は(接続を確認している場合:これは私のコードです。 ..)行、私はそれが呼び出されるのを参照してくださいしかし、私はそのラジオボタンをクリックすると、私のメソッドを呼び出されません。これには何が問題なのですか?

答えて

2
connect(this->ui.myradiobutton1, SIGNAL(clicked), this, SLOT(on_rdbMethod_change(this->ui.myradiobutton1->isChecked, 0))); 

上記間違っている - あなたはあなたのプログラムのstdout出力を見れば、あなたはおそらく(つまり、接続表示されます)、それに関するエラーメッセージを印刷しています。

特に、クリックした後にカッコを入れなかったのと、slot-methods引数がsignal-methodの引数と同じか、少なくともsignal-methodの引数の最初のNと同じでなければなりません議論この場合、シグナル(clicked())には引数がないため、スロットメソッドにも引数を持たせる必要はありません。引数を取らないようにon_rdbMethod_change()を変更するか、代わりに別のslot-methodを指定する必要があります(おそらく、スロットメソッドを実装してon_rdbMethod_change(this-> ui.myradiobutton1-> isChecked、0)を呼び出すことができます)。それがあなたがしたいと思っているものなら)。また、connect()呼び出しはSIGNAL/slot引数リストで値を取ることはできません。それはそれを呼んだのRadioButton on_rdbMethod_changeから

connect(this->ui.myradiobutton1, SIGNAL(clicked()), this, SLOT(on_rdbMethod_change())); 
+0

私はこのスロットに別のラジオボタンを接続するのであれば、どのように私が知っていることができます。

ように補正Connect()の呼び出しは次のようになりますか? –

+1

スロットメソッド内からQObject :: sender()(http://doc.qt.io/qt-5/qobject.html#sender)を呼び出すと、QObjectのQObjectへのポインタが返されます。信号を放出した。次に、そのポインタをdynamic_cast <>を使用してQAbstractButton(または何でも)にダウンキャストし、それをmyradiobutton1(または何でも)と比較して、どのボタンであるかを調べることができます。 (これは良いオブジェクト指向設計とは見なされないことに注意してください。なぜなら、あなたのスロットは他のコンテキストから呼び出されたとしても、おそらく正しいことをしないだろうからですが、実際の問題としては役に立ちます) –

+1

新しい構文とラムダあなたは 'sender()'、ランタイムエラー、およびすべての関連する迷惑行為について忘れることができます。そうすればうまくいくでしょう。 –

関連する問題