आपको 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);
आप QWidgetAction subclassing क्यों पसंद करेंगे? क्या यह आपके 'pwidget' से अलग QWidgetAction को तुरंत चालू करने और 'setDefaultWidget' को कॉल करने के लिए लूसर युग्मन और अधिक रखरखाव कोड प्रदान नहीं करेगा? 'CreateWidget' को लागू करने के लिए उपclass का एकमात्र कारण नहीं होगा? –
यह निर्भर करता है। यदि आप पुन: प्रयोज्य विजेट क्रियाएं करना चाहते हैं और उन्हें बनाने के लिए कोड के समान हिस्सों को फिर से लिखने से बचें तो आपको उन्हें उप-वर्ग करना चाहिए। उदाहरण के लिए मुझे एक बार एक क्यूमेनू की आवश्यकता होती है जिसमें लेबल के साथ कई स्पिन बॉक्स होते हैं, और अलग-अलग न्यूनतम/अधिकतम मान और उपसर्ग होते हैं। 'QWidgetAction' को उप-वर्गीकरण करके मैं एक पुन: प्रयोज्य तत्व प्राप्त करने में सक्षम था, और हर मामले में मुझे केवल कन्स्ट्रक्टर तर्कों को बदलना पड़ा। साथ ही यह एक्शन विगेट्स के साथ एक छोटी लाइब्रेरी बनाने के लिए सीधे आगे है और जब आपको आवश्यकता हो तो बस उसे कॉल करें। – pnezis
मैं इस तरह के कन्स्ट्रक्टर के साथ familar नहीं हूँ: 'स्पिनबॉक्सएक्स (कॉन्स क्यूस्ट्रिंग और शीर्षक): क्यूविजेटएक्शन (एनयूएलएल) {} ' –