2011-05-05 32 views
22

İçinde çocukları kaldırmak istediğim bir QGroupBox widget'ım var. Bunu nasıl yaparım? Hiçbir removeWidget, removeChild, removeItem veya the docs içinde benzer bir şey bulamıyorum. Öğeleri yalnızca bir düzenden nasıl kaldıracağımı görebilirim, ancak görünüşe göre, onu gerçek pencere öğesiden kaldırmaz.pyqt: Bir widget nasıl kaldırılır?

+0

QGroupBox'tan widget'ı kaldırmak için _just_'ı veya widget'ı silmek mi istiyorsunuz? –

+0

@Alex: hepsini tamamen sil – Claudiu

cevap

17

Peki kullanıyor, bu işleri i kaldırmak istediğiniz widget'ı, widget.setParent(None) arayın. Bir düzene eklemenin kapsayıcıya bir widget eklediğini, ancak bir düzenden kaldırmanın ... eğlenceli şeyler olmadığını seviyorum. Widget'ınızın bağımlı hiçbir çocuğun widget'lar varsa

+0

Bir widget'ın bir paftaya koyup koymadığına ve bir ebeveyne sahip olup olmadığına dair bir widgetin yaratıldığını anlamanız gerekir. Bir düzen ekran üzerinde organize etmek için sadece sorumludur, widget'ları göstermek ve gizlemek için güvenilir ve hatta kullanılabilir bir yöntem değildir –

+0

Bir widget eklemek veya kaldırmak için bir yol görmüyorum (herhangi bir eklenti/eklenti işlevi kaldırmak) düzenleri. Widget'ın bir düzenine eklenmesi, görüntülenmesini sağlar (aslında ne yapması, widget'ın üst öğesinin düzen için kapsayıcıya ayarlanmasını sağlar). Aynı widget'ı aynı düzenden kaldırmanın görüntülenmeyeceğini (yani, düzeni eklediğim gibi geri döndürdüğümü) beklerim. ama bunu yapmanın tek yolu, widget'ın ebeveyni hiçbir zaman simetrik olmayan None'a ayarlamak gibi görünüyor. – Claudiu

+0

iyi, ebeveyin 'removeChild' yöntemini kullanabilirsiniz, ancak 'saklamak' daha iyidir –

5

Gerçekten widget'ını silmek istediğinizden emin misiniz? hide yapamaz mı? IMHO kabul edilen yöntem, widget'ların görünmesi ve kullanıcının görünümünden kaybolması için show/hide'u kullanıyor.

alternatif QStackedWidget

+0

yea; [buraya bakın] (http://stackoverflow.com/questions/5889705/pyqt-how-to-remove-elements-from-a-qvboxlayout/5890555#5890555). sanırım saklanmak da işe yarayabilir – Claudiu

+0

@Claidiu: Eğer istediğin buysa, cevabın size çözüm getirdiğini düşünüyorum. –

+0

@Eli: cevabın bana ne olduğunu anlatma burada soruyordu. – Claudiu

32

i kullanabilirsiniz düşünüyorum: Benim testlerde

layout.removeWidget(self.widget_name) 
self.widget_name.deleteLater() 
self.widget_name = None 

o kadar sahip çocuk var bir widget olduğunda:

import sip 
layout.removeWidget(self.widget_name) 
sip.delete(self.widget_name) 
self.widget_name = None 

Eğer sınıf veya global düzeyde widget için bir değişken adınız yoksa, layout.takeAt (index) ile düzeni kaldırır ve QLayoutItem'den widget işaretçisini alabilir, bu işlevler QLayoutItem.widget() yöntemiyle döner. Bu durumda hiçbiri değişken ismine atamak zorunda değilsiniz çünkü işlevinizin dışında başvurulan.

Her iki yöntemi de deneyin ve sizin için neyin işe yaradığını görün (bellekleri bir kaç kez tekrarladıktan sonra sızdırmayın).