2009-09-07 8 views
2

Voici la situation. J'ai une classe qui est dérivée d'un QListView qui ajoute des fonctions de commodité, un widget personnalisé si vous le souhaitez. Je ne veux pas me battre avec le Designer pour utiliser mon widget. Je veux simplement utiliser un QlistView simple dans le concepteur (comme un espace réservé) et le compiler avec pyuic4. À l'exécution je veux remplacer ce QListView normal avec ma propre version.remplacement du widget à l'exécution

Comment pouvez-vous faire cela?

J'espérais quelque chose comme ça dans le initialisation ferait l'affaire:

self.lstView1 = MyListView 

mais il n'a pas ...

+0

S'il vous plaît être plus précis. "Mais ce n'est pas" n'est pas assez explicatif. Y at-il une erreur lors de la compilation? Y a-t-il une erreur lors de l'exécution? Quelle est l'erreur? – erelender

+0

Pas d'erreur avec la ligne ci-dessus. Mon ancienne plaine QListView est toujours là (visible) et aucun signe de mon QListView personnalisé. J'ai aussi essayé d'autres options: self.lstView1 = MyListView (self): ici en utilisant self (un QDialog) comme parent. La liste personnalisée apparaît maintenant mais au mauvais endroit (quelque part dans le coin supérieur gauche et très petit). Puis j'ai essayé self.lstType = TypeList (self.layoutWidget) où self.layoutWidget est la disposition utilisée par le widget placeholder (le QListView simple). Il est là encore, mais toujours pas au bon endroit. En passant, l'ancienne QListview est toujours là et n'est jamais supprimée. –

Répondre

2

Le problème est que vous êtes en train de remplacer simplement l'objet pointé par lstView1 mais ne pas l'ajouter au widget. C'est-à-dire, lorsque vous créez votre objet, vous dites simplement à python de pointer vers votre nouvel objet en utilisant lstView1 mais l'interface utilisateur actuelle utilise l'ancien pointeur puisqu'il est déjà ajouté.

Je vais supposer que vous avez utilisé py4uci pour convertir les fichiers uipour python et vous configurez l'interface comme:

class ExambleUI(QtGUi.QDialog, UI_Example): 
    def __init__(self, parent): 
     QtGui.QDiialog.__init__(self, parent) 
     self.setupUI(self) 
     self.lstView1 = MyListView 

Parce que setupUi est en cours d'exécution avant de modifier la valeur de lstView, vous ne reçoivent pas le nouveau widget. Il suffit d'échanger les lignes:

class ExambleUI(QtGUi.QDialog, UI_Example): 
    def __init__(self, parent): 
     QtGui.QDiialog.__init__(self, parent) 
     self.lstView1 = MyListView 
     self.setupUI(self) 

D'autre part, je vous recommande de suivre cette tutorial et de créer et que vous utilisez widget dans le concepteur, il est facile et plus rapide.

+0

Cela ne fonctionnera pas, car self.lstView1 sera réaffecté dans setupUI – Slavenskij

0

Utilisez QLayout remplacer la fonction:

ui->main_layout->replace(oldWidget, newWidget); 
Questions connexes