2016-10-21 5 views
0

が必要になります。Qtのプッシュボタンは、2つのスロットを呼び出していると私は、私はこのコードを持って、私は別のボタン と2つの関数を呼び出す必要が1

signalMapperSelections = new QSignalMapper(); 

QPushButton *selected_type_button = new QPushButton(); 
selected_type_button->setObjectName("selected_type_button"); 
selected_type_button->setText(get_selected_type().replace(" ", "\n")); 
selected_type_button->setMinimumHeight(80); 
selected_type_button->setMinimumWidth(80); 
selected_type_button->setMaximumHeight(80); 
selected_type_button->setMaximumWidth(80); 
selected_type_button->setStyleSheet(style_toolbutton); 
ui->verticalLayout_selections->addWidget(selected_type_button); 
connect(selected_type_button, SIGNAL(clicked()), signalMapperSelections, SLOT(map())); 
signalMapperSelections->setMapping(selected_type_button, get_selected_type()); 
connect(signalMapperSelections, SIGNAL(mapped(QString)), this, SLOT(show_brands(QString))); 

QPushButton *selected_brand_button = new QPushButton(); 
selected_brand_button->setObjectName("selected_brand_button"); 
selected_brand_button->setText(get_selected_brand().replace(" ", "\n")); 
selected_brand_button->setMinimumHeight(80); 
selected_brand_button->setMinimumWidth(80); 
selected_brand_button->setMaximumHeight(80); 
selected_brand_button->setMaximumWidth(80); 
selected_brand_button->setStyleSheet(style_toolbutton); 
ui->verticalLayout_selections->addWidget(selected_brand_button); 
connect(selected_brand_button, SIGNAL(clicked()), signalMapperSelections, SLOT(map())); 
signalMapperSelections->setMapping(selected_brand_button, get_selected_brand()); 
connect(signalMapperSelections, SIGNAL(mapped(QString)), this, SLOT(show_models(QString))); 

私は「selected_type_button」私だけ実行したい」をクリックすると、 show_brands "を参照してください。しかし、それは "show_brands"と "show_models"の両方の関数を実行しています... Qt :: UniqueConnectionを試しましたが、この問題は修正されません。 両方のボタンが同じ信号を使用しているので、これが起こっていると思います...しかし、私はそれを修正する方法がわかりません。

どうすればこの問題を解決できますか?

+0

QSignalMapperを使用する理由は何ですか? 'signal_ype_bytton'が' show_brand() 'と' signal_brand_button'を起動して 'show_models()'を起動させたいのであれば、 'QSignalMapper'を全く使う必要はありません。 – Mike

+0

現在、両方のボタンがマップされた 'map()'スロットを起動します。後者は 'show_models'と' show_brands'の両方のスロットに接続されているので、いずれかのボタンがクリックされたときに呼び出されます。これは 'QSignalMapper'が使われる方法ではないと思います。正確に何をしたいのかを記述してください。 – Mike

+0

のスロットに渡すQString引数は何ですか?QStringは選択されたタイプまたは選択されたブランドです。 – vitor13almeida

答えて

1

「selected_type_button」をクリックすると、「show_brands」のみを実行します。

QSignalMapperを使用する理由はまったくありません。 selected_type_buttonの信号をshow_brandsスロットに接続し、clicked信号をselected_brand_buttonからshow_modelsスロットに接続するだけで、clicked信号を接続するだけです。

のQStringは、選択したタイプまたは選択したブランドです....

このQString引数は(そう、それはおよそ読み、QSignalMapperを使用して、任意のマッピングを必要としないclicked信号の源とは何の関係もありませんdoc hereQSignalMapper)。現在使用しているマッピングは、接続時(発信時ではなく)に設定されています。/get_selected_brand()は、setMappingの呼び出し時に選択項目を返します(これは明らかに意味していません)。

あなたが直接あなたのスロットにあなたのget_selected_type()/get_selected_brand()関数を呼び出すことができ、ボタンをクリックした時にアイテムを取得するには、あなたのコードは次のようなものになります。

QPushButton *selected_type_button = new QPushButton(); 
selected_type_button->setObjectName("selected_type_button"); 
selected_type_button->setText(get_selected_type().replace(" ", "\n")); 
selected_type_button->setMinimumHeight(80); 
selected_type_button->setMinimumWidth(80); 
selected_type_button->setMaximumHeight(80); 
selected_type_button->setMaximumWidth(80); 
selected_type_button->setStyleSheet(style_toolbutton); 
ui->verticalLayout_selections->addWidget(selected_type_button); 
//Qt 5 new connect syntax (replace ClassName with the current class's name) 
connect(selected_type_button, &QPushButton::clicked, this, &ClassName::show_brands); 

QPushButton *selected_brand_button = new QPushButton(); 
selected_brand_button->setObjectName("selected_brand_button"); 
selected_brand_button->setText(get_selected_brand().replace(" ", "\n")); 
selected_brand_button->setMinimumHeight(80); 
selected_brand_button->setMinimumWidth(80); 
selected_brand_button->setMaximumHeight(80); 
selected_brand_button->setMaximumWidth(80); 
selected_brand_button->setStyleSheet(style_toolbutton); 
ui->verticalLayout_selections->addWidget(selected_brand_button); 
//replace ClassName with the current class's name) 
connect(selected_brand_button, &QPushButton::clicked, this, &ClassName::show_models); 

とあなたのshow_brandsスロットが見えるはずです以下のようなもの:

void ClassName::show_models(){ 
    QString selectedBrand= get_selected_brand(); 

    //show_models here 
} 
012:

//no need for the QString argument 
void ClassName::show_brands(){ 
    QString selectedType= get_selected_type(); 

    //show_brands here 
} 

show_modelsスロットについても同じこと

関連する問題