2011-12-07 18 views
12

मैं आइटम को ComboBox चेक करने योग्य बनाने की कोशिश कर रहा हूं।चेकबॉक्स का कॉम्बोबॉक्स?

http://programmingexamples.net/wiki/Qt/ModelView/ComboBoxOfCheckBoxes

मैं कहाँ QStandardItemModel subclassed और फिर से लागू किया आइटम चेक करने योग्य बनाने के लिए flags() समारोह: मैं इस कोशिश की। तब मैंने इस मॉडल को ComboBox में जोड़ा। दुर्भाग्य से, आइटम के साथ एक चेकबॉक्स प्रकट नहीं होता है। क्या कोई देख सकता है कि मैं गलत कहां गया हूं?

उत्तर

13

क्या आपने एक चेक स्टेटस सेट किया है और साथ ही उन्हें चेक करने योग्य बनाया है? यह चेक बॉक्स शामिल न करने पर वहाँ के रूप में एक वैध जांच राज्य रेंडर करने के लिए नहीं है से नहीं चल पाएगी

item->setData(Qt::Unchecked, Qt::CheckStateRole); 

:

मेरे उदाहरण में नीचे, इस लाइन के लिए महत्वपूर्ण है।

उदाहरण एक combobox, सूची और तालिका में चेक बॉक्स दिखाता है, क्योंकि मैं इसे पहले काम करने के लिए नहीं मिल सका, इसलिए मैंने अलग-अलग विचारों की कोशिश की।

test.cpp

#include <QtGui> 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

    QStandardItemModel model(3, 1); // 3 rows, 1 col 
    for (int r = 0; r < 3; ++r) 
    { 
     QStandardItem* item = new QStandardItem(QString("Item %0").arg(r)); 

     item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 
     item->setData(Qt::Unchecked, Qt::CheckStateRole); 

     model.setItem(r, 0, item); 
    } 

    QComboBox* combo = new QComboBox(); 
    combo->setModel(&model); 

    QListView* list = new QListView(); 
    list->setModel(&model); 

    QTableView* table = new QTableView(); 
    table->setModel(&model); 

    QWidget container; 
    QVBoxLayout* containerLayout = new QVBoxLayout(); 
    container.setLayout(containerLayout); 
    containerLayout->addWidget(combo); 
    containerLayout->addWidget(list); 
    containerLayout->addWidget(table); 

    container.show(); 

    return app.exec(); 
} 

test.pro

QT=core gui 
SOURCES=test.cpp 
+1

बहुत बढ़िया - यह निश्चित रूप से चाल है! अब अगर मैं किसी एक चेकबॉक्स के सिग्नल को स्लॉट में जोड़ना चाहता हूं (कहें, क्लिक किया गया(), यह देखने के लिए कि इसे कब क्लिक किया गया था और यदि यह चेक किया गया है), तो मैं यह कैसे करूँगा? QStandardItem QObject से नहीं लिया गया है, इसलिए इसमें सिग्नल नहीं हो सकते हैं। मैंने QComboBox के संकेतों को देखा - जब मैं एक नया चेकबॉक्स पर होवर करता हूं तो हाइलाइट() सिग्नल उत्सर्जित होता है, लेकिन जब मैं चेकबॉक्स पर क्लिक करता हूं तो कुछ भी उत्सर्जित नहीं होता है? मैंने Qt :: ItemIs को आइटम के झंडे के लिए चयन करने की कोशिश की, और उसके बाद combobox :: currentIndexChanged उत्सर्जित हो गया है, लेकिन combobox बंद हो जाता है, जो मैं नहीं चाहता हूँ। क्या? –

+0

आपको इसे मॉडल, उप-वर्ग 'QAbstractListModel' में करना होगा और 'rowCount',' data', 'flags' और' setData 'लागू करना होगा। सुनिश्चित करें कि मॉडल 'Qt :: CheckStateRole' भूमिका को संभालता है। 'सेटडाटा' में आप अपने संकेतों को आग लगा सकते हैं क्योंकि मॉडल क्यूओब्जेक्ट व्युत्पन्न हैं। –

+0

यह उससे भी आसान है :)। किसी भी subclassing आवश्यक के बिना: कनेक्ट (यह-> मॉडल, सिग्नल (डेटा चेंज (कॉन्स QModelIndex और, कॉन्स QModelIndex और)), यह, एसएलओटी (slot_changed())); साथ : शून्य MainWindow :: slot_changed() { std :: अदालत << "पर प्रकाश डाला।" << std :: endl; अगर (यह-> आइटम-> चेकस्टेट() == क्यूटी :: अनचेक) { std :: cout << "अनचेक!" << std :: endl; } अन्य यदि (यह-> आइटम-> चेकस्टेट() == क्यूटी :: चेक किया गया) { std :: cout << "चेक किया गया!" << std :: endl; } } –

10

मैं एक छोटे से कर दी है।

यदि कोई स्काईशी के कोड को संकलित करता है तो मैक ओएस एक्स पर combobox देशी चेकबॉक्स के साथ combobox के रूप में नहीं दिखता है। आप इसे स्क्रीनशॉट पर देख सकते हैं।

enter image description here

क्यूटी-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); 

बता गया इस प्रतिनिधि दिखता है के साथ स्थापित निम्न तरीका: enter image description here

विंडोज़ पर एक अलग मुद्दा हो सकता है: चेकबॉक्स के टेक्स्ट ने किसी आइटम के चारों ओर पृष्ठभूमि या बिंदीदार सीमा चिपका दी है:

enter image description here

इस उपस्थिति एक बस लाइन QStyledItemDelegate से पहले ओवरराइड रंग में निम्नलिखित पंक्ति जोड़ सकते हैं :: रंग बदलने के लिए (painter_, refToNonConstOption, index_) (कोड नमूने में इस लाइन टिप्पणी की गयी है) :

refToNonConstOption.state &= ~QStyle::State_HasFocus & ~QStyle::State_MouseOver; 

परिणाम:

enter image description here

+2

हाय, के बाद से वहाँ बता गया (विंडोज़ उदाहरण) में एक से अधिक चयन यह मतलब नहीं है दिखाने के लिए है "आइटम 0" पाठ।क्या उस पाठ को अक्षम करने या इसे बदलने के लिए कोई तरीका है "कृपया, आइटम का चयन करें" – Aleksandar

+0

@Aleksandar या "आइटम 0" के बजाय जो * नहीं चुना गया है, हमें "आइटम 1, आइटम 2" देखना चाहिए: a कॉम्बो बॉक्स में सभी चयनित आइटम का समापन। क्या कोई जानता है कि यह करने योग्य है या नहीं? –

+0

@yvesBamumes मैंने एक उप वर्ग एक QComboBox बनाया है जो चयन (और कुछ अन्य सुविधाओं) के आधार पर दृश्यमान पाठ को अपडेट करता है https://gist.github.com/mistic100/c3b7f3eabc65309687153fe3e0a9a720 – Mistic

0

आप QListView के साथ इस कोशिश कर सकते हैं:

QStringList values = QStringList << "check 1" << "check 2" << "check 3" << "check 4"; 

QStandardItemModel model = new QStandardItemModel; 
for (int i = 0; i < values.count(); i++) 
{ 
    QStandardItem *item = new QStandardItem(); 
    item->setText(values[i]); 
    item->setCheckable(true); 
    item->setCheckState(Qt::Unchecked); 
    model->setItem(i, item); 
} 

ui->list->setModel(model); 
0

मैं लिनक्स टकसाल पर इस उदाहरण करने की कोशिश की, लेकिन मैं चेक बॉक्स दृश्यमान नहीं बना सकते। मुझे SubclassOfQStyledItemDelegate कक्षा को लागू करना था और प्रतिनिधि को चेकबॉक्स में सेट करना था क्योंकि नेपिटलो और gshep ने सलाह दी थी।

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