2012-02-08 5 views
11

まず、実行時までの長さをわからないQWidgetのリストがあります。 QListWidgetを作成し、誰かがそれらをクリックすると、currentItemChanged(QListWidgetItem*, QListWidgetItem*)というシグナルを使ってそれを捕まえ、クリックしたアイテムのインデックスを取得します。QMenuにQActionのリストを追加して、それらを1つのスロットで処理する方法は?

QMenuでも同様のことをしたいと思います。私はQMenuとそのアクションが構築されるときにリストを知るでしょうが、私はこれをハードコーディングすることはできません。

アクションを作成し、その信号を捕捉し、メニューリスト内のアクションの位置(インデックス)に応じて異なるスロットに接続するにはどうすればよいですか?他のアプリケーションでこれを使用しているので、これを解決するには何らかの方法が必要です。私はマッピングを見ようとしましたが、私はそれをどのように使用するかについて頭を悩ますことはできませんでした。

スロット内でsenderを取得しようとしましたが、有効な情報を取得できませんでした。

答えて

15

QAction::setDataで作成したときに各アクションにインデックス(または他のデータ)を関連付けることができ、信号QMenu::triggered(QAction*)をあなたのスロットに接続することができます。

スロットパラメータのQAction::data()機能でデータを取得できます。

MyClass::MyClass() { 
    // menu creation 
    for(...) { 
     QAction *action = ...; 
     action->setData(10); 
     ... 
     menu->addAction(action); 
    } 
    // only one single signal connection 
    connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(mySlot(QAction*))); 
} 

void MyClass::mySlot(QAction *action) { 
    int value = action->data().toInt(); 

} 

他の方法:信号マッピングまたはsender()の使用、that article of Qt Quaterlyで説明されています。

+0

はああありがとう!実際には、.propertyアクションを使用し、 "for"ループを使用して "i"に "index"を設定することで、同様の方法で解決しました。私はデータがそれを解決する別の方法だろうと思う:) – chikuba

+0

私は同じソリューションを使用してみましたが、それは動作しません。 http://stackoverflow.com/q/14151443/986760を見て、助けてください。ありがとう? – fayyazkl

3

QMenuに固有でないより一般的な方法は、QActionGroupクラスです。これにより、特定のメニュー項目を関連グループとして分離したり、異なるウィジェットをまとめてグループ化することができます。

void MyClass::InitMenu(QMenu* menu) 
{ 
    QActionGroup* actions1 = new QActionGroup(menu); 
    actions1->setExclusive(false); 
    actions1->addAction(menu->addAction(tr("Action1")))->setData(1); 
    actions1->addAction(menu->addAction(tr("Action2")))->setData(2); 
    actions1->addAction(menu->addAction(tr("Action3")))->setData(3); 
    actions1->addAction(menu->addAction(tr("Action4")))->setData(4); 
    actions1->addAction(menu->addAction(tr("Action5")))->setData(5); 
    connect(actions1, SIGNAL(triggered(QAction*)), SLOT(MySlot(QAction*))); 

    QActionGroup* actions2 = new QActionGroup(menu); 
    actions2->addAction(menu->addAction(tr("Undo Action1")))->setData(1); 
    actions2->addAction(menu->addAction(tr("Undo Action2")))->setData(2); 
    //... 
    connect(actions2, SIGNAL(triggered(QAction*)), SLOT(MyUndoSlot(QAction*))); 
} 

とスロットで:

void MyClass::MySlot(QAction* triggeredAction) 
{ 
    // use either the action itself... or an offset 
    int value = triggeredAction->data().toInt() 
} 
関連する問題