2012-12-12 16 views

cevap

9

Bozuk bir tane ... yapılan yerde ve sadece bir fonksiyon vardır form buna göre kendini ayarlar. Widget'ın etiketi labelForField kullanılarak alınabilir.

Python Qt kodu:

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

'ı kullanmayı deneyin, böylece layout.update() yöntemini çağırmalıyım, çünkü sadece deleteLater() – borovsky

+0

@borovsky'den sonra iyi görünüyor. Üzgünüm, ne demek istediğini anlamadım. DeleteLater() 'i çağırmadan önce ne yapıyorsunuz? – ekhumoro

+0

@borovsky. Bir widget silindiğinde, Qt tüm çocuklarını da yinelemeli olarak siler (bu yüzden widget'ların her zaman ebeveynleri olduğundan emin olmak iyi bir fikir olabilir). Python tarafında, çöp toplayıcısı sonunda temizlik yapar. Bununla birlikte, bir nesneyi referans olarak tutuyorsanız (ör. Örnek özniteliği), bunu kendiniz açıkça silmek isteyebilirsiniz. Qt, C++ parçasını sildikten sonra, Python parçası kullanılamaz duruma gelir, bu nedenle bir şey yapmaya çalışırsanız RuntimeErrors'u alırsınız. – ekhumoro

0

Bu aslında çok iyi bir nokta ... addRow() için açık bir ters işlev yoktur. Onları çıkarmadan önce tüm öğeleri almak

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 
} 

Not:

aşağıdakileri yapabilirsiniz satır kaldırmak için. Çünkü bir öğe kaldırıldığında rollerinin değişip değişmeyeceğini bilmiyorum. Bu davranış belirtilmemiş, bu yüzden ben güvenli oynuyorum. Qt tasarımcısında, bir öğeyi bir formdan kaldırdığınızda, satırındaki diğer öğe tüm alanı kaplar (bu, rolünün değiştiği anlamına gelir).

Belki tekerleği yeniden keşfetti ama sadece silinmek üzere (eğer varsa) widget'ı ve etiketini planlamak ve izin verebilir

1

benim çözüm ... başlık dosyasına

:

QPointer<QFormLayout> propertiesLayout; 

cpp dosyasında:

// 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; 
} 
İlgili konular