मैं एक छोटे से कर दी है।
यदि कोई स्काईशी के कोड को संकलित करता है तो मैक ओएस एक्स पर combobox देशी चेकबॉक्स के साथ combobox के रूप में नहीं दिखता है। आप इसे स्क्रीनशॉट पर देख सकते हैं।
क्यूटी-4.8.5 और 5.1.1 के साथ परीक्षण किया गया।
ऐसा लगता है जैसे क्यूटी इन नियंत्रणों को स्वयं ही खींचती है। हमारी टीम को शुद्ध दुर्घटना द्वारा निम्नलिखित कार्यवाही मिली है।आप QStyledItemDelegate
उपवर्ग और paint()
इस तरह reimplement कर सकते हैं:
void SubclassOfQStyledItemDelegate::paint(QPainter * painter_, const QStyleOptionViewItem & option_, const QModelIndex & index_) const
{
QStyleOptionViewItem & refToNonConstOption = const_cast<QStyleOptionViewItem &>(option_);
refToNonConstOption.showDecorationSelected = false;
//refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
QStyledItemDelegate::paint(painter_, refToNonConstOption, index_);
}
फिर आप निम्नलिखित लाइनों को जोड़कर कॉम्बो बॉक्स को यह प्रतिनिधि सेट कर सकते हैं skyhisi करने के कोड:
SubclassOfQStyledItemDelegate *delegate = new SubclassOfQStyledItemDelegate(this);
combo->setItemDelegate(delegate);
बता गया इस प्रतिनिधि दिखता है के साथ स्थापित निम्न तरीका:
विंडोज़ पर एक अलग मुद्दा हो सकता है: चेकबॉक्स के टेक्स्ट ने किसी आइटम के चारों ओर पृष्ठभूमि या बिंदीदार सीमा चिपका दी है:
इस उपस्थिति एक बस लाइन QStyledItemDelegate से पहले ओवरराइड रंग में निम्नलिखित पंक्ति जोड़ सकते हैं :: रंग बदलने के लिए (painter_, refToNonConstOption, index_) (कोड नमूने में इस लाइन टिप्पणी की गयी है) :
refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver;
परिणाम:
बहुत बढ़िया - यह निश्चित रूप से चाल है! अब अगर मैं किसी एक चेकबॉक्स के सिग्नल को स्लॉट में जोड़ना चाहता हूं (कहें, क्लिक किया गया(), यह देखने के लिए कि इसे कब क्लिक किया गया था और यदि यह चेक किया गया है), तो मैं यह कैसे करूँगा? QStandardItem QObject से नहीं लिया गया है, इसलिए इसमें सिग्नल नहीं हो सकते हैं। मैंने QComboBox के संकेतों को देखा - जब मैं एक नया चेकबॉक्स पर होवर करता हूं तो हाइलाइट() सिग्नल उत्सर्जित होता है, लेकिन जब मैं चेकबॉक्स पर क्लिक करता हूं तो कुछ भी उत्सर्जित नहीं होता है? मैंने Qt :: ItemIs को आइटम के झंडे के लिए चयन करने की कोशिश की, और उसके बाद combobox :: currentIndexChanged उत्सर्जित हो गया है, लेकिन combobox बंद हो जाता है, जो मैं नहीं चाहता हूँ। क्या? –
आपको इसे मॉडल, उप-वर्ग 'QAbstractListModel' में करना होगा और 'rowCount',' data', 'flags' और' setData 'लागू करना होगा। सुनिश्चित करें कि मॉडल 'Qt :: CheckStateRole' भूमिका को संभालता है। 'सेटडाटा' में आप अपने संकेतों को आग लगा सकते हैं क्योंकि मॉडल क्यूओब्जेक्ट व्युत्पन्न हैं। –
यह उससे भी आसान है :)। किसी भी subclassing आवश्यक के बिना: कनेक्ट (यह-> मॉडल, सिग्नल (डेटा चेंज (कॉन्स QModelIndex और, कॉन्स QModelIndex और)), यह, एसएलओटी (slot_changed())); साथ : शून्य MainWindow :: slot_changed() { std :: अदालत << "पर प्रकाश डाला।" << std :: endl; अगर (यह-> आइटम-> चेकस्टेट() == क्यूटी :: अनचेक) { std :: cout << "अनचेक!" << std :: endl; } अन्य यदि (यह-> आइटम-> चेकस्टेट() == क्यूटी :: चेक किया गया) { std :: cout << "चेक किया गया!" << std :: endl; } } –