2012-02-08 11 views
11

सबसे पहले, मेरे पास QWidget की एक सूची है जिसे मैं रनटाइम तक की लंबाई नहीं जानूंगा। मैं फिर QListWidget बना देता हूं जहां मैं उन्हें दिखाता हूं और जब कोई उन्हें क्लिक करता है तो मैं इसे पकड़ने के लिए currentItemChanged(QListWidgetItem*, QListWidgetItem*) सिग्नल का उपयोग करता हूं और क्लिक किए गए आइटम की अनुक्रमणिका प्राप्त करता हूं।QMenu पर QActions की सूची कैसे जोड़ें और उन्हें एक स्लॉट से कैसे संभालें?

अब मैं 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

ओह धन्यवाद! मैंने वास्तव में क्रियाओं का उपयोग करके इसे उसी तरह हल किया। प्रॉपर्टी और "इंडेक्स" को "i" (फॉर-लूप का उपयोग करके) सेट करना। मुझे लगता है कि डेटा इसे हल करने का एक और तरीका होगा :) – 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() 
}