2012-12-12 14 views
7

मैं इस कोड है । मैं .takeAt() का उपयोग कर सकता हूं, लेकिन मैं तर्क कैसे प्राप्त कर सकता हूं? मैं लेबल इंडेक्स, या myEdit की अनुक्रमणिका कैसे प्राप्त करूं?कैसे बस QFormLayout में पंक्ति को हटाने के लिए प्रोग्राम के

+0

आप/का उपयोग करना चाहिए करना चाहिए पॉइंटर्स (मुझे लगता है कि यह सी ++ कोड है)। – UmNyobe

+1

निकालें Widget (myEdit) –

उत्तर

9

तुम बस विजेट और उसके लेबल निर्धारित कर सकते हैं हटाने के लिए (अगर यह एक है), और बनाया फॉर्म तदनुसार खुद को समायोजित करें। विजेट के लिए लेबल labelForField का उपयोग करके पुनर्प्राप्त किया जा सकता है।

अजगर क्यूटी कोड:

label = myQformLayout.labelForField(myEdit) 
    if label is not None: 
     label.deleteLater() 
    myEdit.deleteLater() 
+0

ठीक है तो मुझे लेआउट.अपडेट() को कॉल करना चाहिए क्योंकि यह केवल हटाए जाने के बाद अच्छा दिखता है() – borovsky

+0

@borovsky। क्षमा करें, मुझे समझ में नहीं आता कि आपका क्या मतलब है। 'DeleteLater()' को कॉल करने से पहले आप क्या कर रहे हैं? – ekhumoro

+0

@borovsky। जब कोई विजेट हटा दिया जाता है, तो क्यूटी अपने सभी बच्चों को फिर से हटा देगा (यही कारण है कि यह सुनिश्चित करना एक अच्छा विचार हो सकता है कि विजेट हमेशा माता-पिता हों)। पायथन पक्ष पर, कचरा-संग्राहक अंततः सफाई करेगा। हालांकि, अगर आप किसी ऑब्जेक्ट का संदर्भ रखते हैं (उदा। एक उदाहरण विशेषता) तो आप इसे स्वयं को स्पष्ट रूप से हटा सकते हैं। एक बार क्यूटी ने सी ++ भाग को हटा दिया है, तो पाइथन भाग अनुपयोगी हो जाता है, इसलिए यदि आप इसके साथ कुछ भी करने का प्रयास करते हैं तो आपको रनटाइमर्स मिलेंगे। – ekhumoro

0

यह वास्तव में एक बहुत अच्छा बिंदु है ... addRow() के लिए कोई स्पष्ट रिवर्स फ़ंक्शन नहीं है।

QLineEdit *myEdit; 
int row; 
ItemRole role; 
//find the row 
myQFormLayout->getWidgetPosition(myEdit, &row, &role); 
//stop if not found 
if(row == -1) return; 

ItemRole otheritemrole; 
if(role == QFormLayout::FieldRole){ 
    otheritemrole = QFormLayout::LabelRole; 
} 
else if(role == QFormLayout::LabelRole){ 
    otheritemrole = QFormLayout::FieldRole; 
} 

//get the item corresponding to the widget. this need to be freed 
QLayoutItem* editItem = myQFormLayout->itemAt (int row, role); 

QLayoutItem* otherItem = 0; 

//get the item corresponding to the other item. this need to be freed too 
//only valid if the widget doesn't span the whole row 
if(role != QFormLayout::SpanningRole){ 
    otherItem = myQFormLayout->itemAt(int row, role); 
} 

//remove the item from the layout 
myQFormLayout->removeItem(editItem); 
delete editItem; 

//eventually remove the other item 
if(role != QFormLayout::SpanningRole){ 
    myQFormLayout->removeItem(otherItem); 
    delete otherItem 
} 

ध्यान दें कि मैं उन्हें हटाने से पहले सभी वस्तुओं को पुनः प्राप्त:

एक पंक्ति आप निम्न कर सकते निकालने के लिए। ऐसा इसलिए है क्योंकि मुझे नहीं पता कि कोई आइटम हटा दिए जाने पर उनकी भूमिका बदलेगी या नहीं। यह व्यवहार निर्दिष्ट नहीं है इसलिए मैं सुरक्षित खेल रहा हूं। क्यूटी डिजाइनर में, जब आप किसी फॉर्म से किसी आइटम को हटाते हैं, तो अन्य आइटम पर पंक्ति सभी जगह लेती है (जिसका अर्थ है कि उसकी भूमिका बदलती है ...)।

हो सकता है कि वहाँ एक समारोह कहीं और नहीं है, मैं पहिया में नयापन लाया गया, लेकिन मैं एक टूटी हुई एक ...

1

मेरी समाधान ...

हेडर फाइल में

:

QPointer<QFormLayout> propertiesLayout; 

cpp फ़ाइल में:

// Remove existing info before re-populating. 
while (propertiesLayout->count() != 0) // Check this first as warning issued if no items when calling takeAt(0). 
{ 
    QLayoutItem *forDeletion = propertiesLayout->takeAt(0); 
    delete forDeletion->widget(); 
    delete forDeletion; 
}