2011-12-02 7 views
8

में QMenu में QWidget जोड़ने का कोई तरीका है, मैं एक टेक्स्ट एडिटर बना रहा हूं और QMenu में QComboBox डालना चाहता हूं। मुझे QMenu के अंदर कोई विधि नहीं मिली जिसने ऐसी चीज को संभाला। निकटतम QMenu::addAction() है। मैं इस बाधा के चारों ओर घूमने की सोच रहा था।QtCreator

धन्यवाद!

उत्तर

16

आपको QWidgetAction उप-वर्ग करना होगा और फिर बस अपने मेनू में addAction पर कॉल करना होगा। एक लेबल

class SpinBoxAction : public QWidgetAction { 
public: 
    SpinBoxAction (const QString& title) : 
     QWidgetAction (NULL) { 
     QWidget* pWidget = new QWidget (NULL); 
     QHBoxLayout* pLayout = new QHBoxLayout(); 
     QLabel pLabel = new QLabel (title); 
     pLayout->addWidget (pLabel); 
     pSpinBox = new QSpinBox(NULL); 
     pLayout->addWidget (pSpinBox); 
     pWidget->setLayout (pLayout); 

     setDefaultWidget(pWidget); 
    } 

    QSpinBox * spinBox() { 
     return pSpinBox; 
    } 

private: 
    QSpinBox * pSpinBox; 
}; 

साथ के लिए स्पिन बॉक्स कार्रवाई

उदाहरण कोड अब बस इसे बना सकते हैं और अपने मेनू में जोड़ने

SpinBoxAction * spinBoxAction = new SpinBoxAction(tr("Action Title")); 
// make a connection 
connect(spinBoxAction ->spinBox(), SIGNAL(valueChanged(int)), 
     this, SLOT(spinboxValueChanged(int))); 
// add it to your menu 
menu->addAction(spinBoxAction); 
+0

आप QWidgetAction subclassing क्यों पसंद करेंगे? क्या यह आपके 'pwidget' से अलग QWidgetAction को तुरंत चालू करने और 'setDefaultWidget' को कॉल करने के लिए लूसर युग्मन और अधिक रखरखाव कोड प्रदान नहीं करेगा? 'CreateWidget' को लागू करने के लिए उपclass का एकमात्र कारण नहीं होगा? –

+0

यह निर्भर करता है। यदि आप पुन: प्रयोज्य विजेट क्रियाएं करना चाहते हैं और उन्हें बनाने के लिए कोड के समान हिस्सों को फिर से लिखने से बचें तो आपको उन्हें उप-वर्ग करना चाहिए। उदाहरण के लिए मुझे एक बार एक क्यूमेनू की आवश्यकता होती है जिसमें लेबल के साथ कई स्पिन बॉक्स होते हैं, और अलग-अलग न्यूनतम/अधिकतम मान और उपसर्ग होते हैं। 'QWidgetAction' को उप-वर्गीकरण करके मैं एक पुन: प्रयोज्य तत्व प्राप्त करने में सक्षम था, और हर मामले में मुझे केवल कन्स्ट्रक्टर तर्कों को बदलना पड़ा। साथ ही यह एक्शन विगेट्स के साथ एक छोटी लाइब्रेरी बनाने के लिए सीधे आगे है और जब आपको आवश्यकता हो तो बस उसे कॉल करें। – pnezis

+0

मैं इस तरह के कन्स्ट्रक्टर के साथ familar नहीं हूँ: 'स्पिनबॉक्सएक्स (कॉन्स क्यूस्ट्रिंग और शीर्षक): क्यूविजेटएक्शन (एनयूएलएल) {} ' –

1

आप मेनू विजेट के रूप में हमेशा QWidget या QFrame का उपयोग कर सकते हैं, फिर उस पर QHBoxLayout डालें और अंदर अपना QWidgets डालें।

+0

यह विचार वास्तव में मेरे लिए हुआ। मैं क्यूटी के लिए थोडा नया हूं इसलिए मुझे माफ़ कर दो अगर यह थोड़े बुनियादी है: मैं अपने स्वयं के QWidget को मेनू विजेट के रूप में कैसे सेट करूंगा। –

1

QWidgetAction एक QAction कि एक QWidget होता है। आप इसका उपयोग अपने QComboBox को एन्सेप्लेट करने के लिए कर सकते हैं और QMenu::addAction के माध्यम से इसे अपने मेनू में जोड़ सकते हैं।

संबंधित मुद्दे