2011-08-11 30 views
1

私はプログラムのスロットに値としてenumを渡そうとしていますが、いくつか問題があります。私のヘッダファイルでは、私は、列挙型を作成しました:パラメータとしてenumを持つQtシグナル

Q_ENUMS(button_type); 
enum button_type {button_back, button_up, button_down, button_ok}; 
Q_DECLARE_METATYPE(button_type); 

をそして、私の.cppファイルに私がスロットにそれを渡すようにしようとしている:

QObject::connect(buttons->ui.pushButton_back, SIGNAL(clicked()), this, SLOT(input_handler(button_back))); 

しかし、私は、コードをコンパイルするときに私が取得します:

Object::connect: No such slot main_application::input_handler(button_back) in main_application.cpp:44 
Object::connect: (sender name: 'pushButton_back') 
Object::connect: (receiver name: 'main_applicationClass') 

引数をinput_handlerに渡さないとコンパイルされて正常に動作します。

私はqRegisterMetaTypeを呼び出す必要があることも読んでいますが、正しい構文が得られないようです。

qRegisterMetaType<button_type>("button_type"); 

が、私はこのエラーを取得する:ここでは、私が試したものだ

main_application.h:15:1: error: specializing member ‘::qRegisterMetaType<button_type>’ requires ‘template<>’ syntax 

誰も私のために、この上でいくつかの光を当てることができますか?

ありがとうございます!

マーロン

+0

この「専門会員」のエラーはありません...? – Smar

答えて

1

それは種類を期待していたときにあなたがSLOT()マクロ値を渡しています。より根本的に、これはあまり意味がありません。なぜなら、あなたが達成しようとしているのは、スロットを一定にすることです。スロット機能にbutton_backを直接使用しないのはなぜですか?

あなたbutton_typeがかかりますが、その後、あなたは、パラメータとして1を渡し信号に接続する必要があると思いスロットを定義することができます。

あなたは実際に何をしようとしていますか?署名がmain_application::input_handler(button_type)あり、button_backを入力しない値であるため、もちろん

0
Object::connect: No such slot main_application::input_handler(button_back) 

が、存在します。そしてあなたが正しい署名をしても、シグネチャの不一致のためにその信号とスロットを接続することはできません。

また、いつでもQObject::sender()機能を使用して、どのボタンが押されたかを知ることができます。

3

信号とスロットは同じパラメータを持つ必要があります。あなたが望むのはQSignalMapperです。

編集: ここは、私のアプリケーションの例です。それぞれが同じスロットに接続された10個のメニューアクションを作成します。gotoHistoryPageしかし、それぞれ異なるint値で呼び出されます。

m_forwardMenu = new QMenu(); 
for(int i = 1; i<=10; i++) 
{ 
    QAction* action = m_forwardMenu->addAction(QString("%1").arg(i)); 
    m_forwardActions.push_back(action); 
    m_signalMapper->setMapping(action, i); 
    connect(action, SIGNAL(triggered()), m_signalMapper, SLOT(map())); 
} 
ui.forwardButton->setMenu(m_forwardMenu); 
connect(m_signalMapper, SIGNAL(mapped(int)), this, SLOT(gotoHistoryPage(int))); 
関連する問題