2009-11-23 5 views
1

Je développe un système pour un client qui est affiché dans un ensemble d'onglets, et montre une table dans le centralwidget avec des données extraites d'une base de données.PyQt: removeChild/addChild QGroupBox

Selon les événements de la souris, le conteneur (groupBox) doit être supprimé du centralwidget ou ajouté avec les nouvelles données mises à jour pour la table.

Voici un morceau de code qui fonctionne bien et montre la table avec des données à l'intérieur du GroupBox:

self.tab_tableview = QtGui.QWidget() 
    self.tab_tableview.setObjectName("tab_tableview") 

    self.viewGroupBox = QtGui.QGroupBox(self.tab_tableview) 
    self.viewGroupBox.setGeometry(QtCore.QRect(10, 0, 751, 501)) 
    self.viewGroupBox.setObjectName("viewGroupBox") 

    self.vBox = QtGui.QVBoxLayout() 
    self.vBox.addWidget(self.newGroupBox) 
    self.vBox.setGeometry(QtCore.QRect(40, 170, 171, 111)) 
    self.vBox.addStretch(1) 

    self.viewTableWidget = QtGui.QTableView(self.viewGroupBox) 
    self.viewTableWidget.setGeometry(QtCore.QRect(10, 20, 731, 471)) 
    self.viewTableWidget.setObjectName("viewTableWidget") 

    updatedTableModel=self.callShowTable() 
    self.viewTableWidget.setModel(updatedTableModel) 

    self.viewTableWidget.setColumnWidth(0,30) 
    self.viewTableWidget.setColumnWidth(1,550) 

    self.viewTabWidget.addTab(self.tab_tableview, "") 

    if removeContainer_Bottun_Pressed: 
     print "remove bottun was pressed" 
     self.vBox.removeWidget(self.viewGroupBox) 

    if addContainer_Bottun_Pressed: 
     print "add bottun was pressed" 
     self.vBox.addWidget(self.viewGroupBox) 

Le programme détecte « removeContainer_Bottun_Pressed » est vrai, et exécutez le removeWidget (self.newGroupBox) . Bien que removeWidget s'exécute, le groupBox reste au même endroit, au lieu de disparaître et réapparaître sur demande.

Qu'est-ce qui manque ici?

Tous les commentaires et suggestions sont très appréciés.

Répondre

2

Je ne pense pas appeler removeWidget est nécessaire. Essayez simplement d'appeler widget.deleteLater sur ce que vous voulez supprimer. Ensuite, lorsque vous voulez l'ajouter, recréez-le et utilisez layout.insertWidget pour le mettre à sa place. Est-ce que ça marche?

Il travaille pour moi ici, sur Windows XP ...

import sys 

from PyQt4 import QtGui, QtCore 

app = QtGui.QApplication(sys.argv) 

widget = QtGui.QWidget() 
widget_layout = QtGui.QHBoxLayout() 
widget.setLayout(widget_layout) 

def add_group_box(): 
    group_box = widget.group_box = QtGui.QGroupBox() 
    group_layout = QtGui.QVBoxLayout() 
    group_box.setLayout(group_layout) 

    for i in range(2): 
     group_layout.addWidget(QtGui.QRadioButton(str(i))) 

    widget_layout.insertWidget(0, group_box) 
add_group_box() 

show_button = QtGui.QPushButton("show") 
hide_button = QtGui.QPushButton("hide") 
def on_show(): 
    if not widget.group_box: 
     add_group_box() 
def on_hide(): 
    if widget.group_box: 
     widget.group_box.deleteLater() 
     widget.group_box = None 
show_button.connect(show_button, QtCore.SIGNAL("clicked()"), on_show) 
hide_button.connect(hide_button, QtCore.SIGNAL("clicked()"), on_hide)  
widget_layout.addWidget(show_button) 
widget_layout.addWidget(hide_button) 

widget.show() 

app.exec_() 
+0

Bonjour Jesse ... merci beaucoup pour votre contribution! Cela a permis au deleteBox de fonctionner parfaitement. – ThreaderSlash

1
  1. Il semble contenir une faute de frappe: addContainer_Bottun_Pressed

    Ne serait-il addContainer_Bott o n_Pressed à la place?

  2. Vous devrez peut-être appeler une sorte de méthode "relayout" après avoir modifié les widgets à la volée. Vous devriez essayer d'appeler ceci après la suppression/ajout de widgets enfants: self.vBox.adjustSize()

1

Tout d'abord merci pour toutes les entrées que je recevais ici. Dans la séquence, le code source fonctionne - ou fonctionne au moins à 80%.

  • 80% - Que fait-il: radioButton pour supprimer groupBox; radioButton pour dire bonjour; radioButton pour dire Nice;

  • 20% - Ce qu'il ne fait toujours pas: radioButton pour ajouter groupBox.

Comme vous pouvez le voir dans la séquence, la fonction addBox est appelée, mais il n'ajoute GroupBox pour la deuxième fois il fonctionne.

Voici les importations:

#//===========================================================//# 
import os 
import platform 
import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4 import QtCore, QtGui 
#//===========================================================//# 

Voici la classe Ui_Addwidget ..

#//===========================================================//# 
class Ui_Addwidget(object): 
    def runbutton3(self): 
     print "hello // radioButton3.isChecked : ", self.radioButton3.isChecked() 
    def runButton4(self): 
     print "nice // radioButton4.isChecked : ", self.radioButton4.isChecked() 
    def addBox(self): 
     self.vLayout_wdg = QtGui.QWidget(self.centralwidget) 
     self.vLayout_wdg.setGeometry(QtCore.QRect(40, 160, 171, 121)) 
     self.vLayout_wdg.setObjectName("vLayout_wdg") 

     self.vLayoutBoxObj = QtGui.QHBoxLayout() 
     self.vLayout_wdg.setLayout(self.vLayoutBoxObj) 

     self.newGroupBox = self.vLayout_wdg.newGroupBox = QtGui.QGroupBox(self.vLayout_wdg) 
     self.newGroupBox.setObjectName("newGroupBox") 
     self.newGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "newGroupBox", None, QtGui.QApplication.UnicodeUTF8)) 

     self.groupLayoutBox = QtGui.QVBoxLayout() 
     self.groupLayoutBox.setObjectName("groupLayoutBox") 
     self.newGroupBox.setLayout(self.groupLayoutBox) 

     self.radioButton3 = QtGui.QRadioButton() 
     self.radioButton3.setGeometry(QtCore.QRect(30, 30, 101, 21)) 
     self.radioButton3.setObjectName("helloRadioButton") 
     self.radioButton3.setText(QtGui.QApplication.translate("MainWindow", "say: Hello", None, QtGui.QApplication.UnicodeUTF8)) 

     self.radioButton4 = QtGui.QRadioButton() 
     self.radioButton4.setGeometry(QtCore.QRect(30, 60, 111, 18)) 
     self.radioButton4.setObjectName("niceRadioButton") 
     self.radioButton4.setText(QtGui.QApplication.translate("MainWindow", "say: Nice", None, QtGui.QApplication.UnicodeUTF8)) 

     self.groupLayoutBox.addWidget(self.radioButton3) 
     self.groupLayoutBox.addWidget(self.radioButton4) 

     self.vLayoutBoxObj.insertWidget(0, self.newGroupBox) 
    def on_show(self): 
     print "addBox // radioButton1.isChecked : ", self.radioButton1.isChecked() 
     if not self.vLayout_wdg.newGroupBox: 
      self.addBox() 
    def on_hide(self): 
     print "deleteBox // radioButton2.isChecked : ", self.radioButton2.isChecked() 
     if self.vLayout_wdg.newGroupBox: 
      self.vLayout_wdg.newGroupBox.deleteLater() 
      self.vLayout_wdg.newGroupBox = None 
    def connectEvent(self): 
     QtCore.QObject.connect(self.radioButton1, QtCore.SIGNAL("toggled(bool)"),self.on_show) 
     QtCore.QObject.connect(self.radioButton2, QtCore.SIGNAL("toggled(bool)"),self.on_hide) 
     QtCore.QObject.connect(self.radioButton3, QtCore.SIGNAL("toggled(bool)"),self.runbutton3) 
     QtCore.QObject.connect(self.radioButton4, QtCore.SIGNAL("toggled(bool)"),self.runButton4) 
    def selectBox(self): 
     self.selectGroupBox = QtGui.QGroupBox(self.centralwidget) 
     self.selectGroupBox.setGeometry(QtCore.QRect(40, 20, 171, 111)) 
     self.selectGroupBox.setObjectName("selectGroupBox") 
     self.selectGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "select", None, QtGui.QApplication.UnicodeUTF8)) 

     self.radioButton1 = QtGui.QRadioButton(self.selectGroupBox) 
     self.radioButton1.setGeometry(QtCore.QRect(30, 30, 111, 18)) 
     self.radioButton1.setObjectName("radioButton1") 
     self.radioButton1.setText(QtGui.QApplication.translate("MainWindow", "add groupbox", None, QtGui.QApplication.UnicodeUTF8)) 

     self.radioButton2 = QtGui.QRadioButton(self.selectGroupBox) 
     self.radioButton2.setGeometry(QtCore.QRect(30, 60, 111, 18)) 
     self.radioButton2.setObjectName("radioButton2") 
     self.radioButton2.setText(QtGui.QApplication.translate("MainWindow", "delete groupbox", None, QtGui.QApplication.UnicodeUTF8)) 
    def addwidget_centralwdg(self,MainWindow): 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 

     self.selectBox() 
     self.addBox() 
     self.connectEvent() 

     MainWindow.setCentralWidget(self.centralwidget) 
    def addwidget_setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(250, 300) 
     self.addwidget_centralwdg(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 
#//===========================================================//# 

Ici vous avez la classe mainDesign ...

#//===========================================================//# 
class mainDesign(QtGui.QMainWindow,Ui_Addwidget): 
    def __init__(self,parent=None): 
     super(mainDesign,self).__init__(parent) 
     self.addwidget_setupUi(self) 
#//===========================================================//# 

Et bien sûr, la principale def ...

#//===========================================================//#   
def main(): 
    app = QtGui.QApplication(sys.argv) 
    main = mainDesign() 
    main.show() 
    sys.exit(app.exec_()) 
main() 
#//===========================================================//# 

Pour l'essayer, il suffit de copier le code et les classes à un fichier * .py. Et ça va courir.

Tous les autres commentaires ou suggestions pour résoudre la pièce manquante du puzzle, sont les bienvenus et appréciés.

0

Voici la solution finale, le travail 100%:

  • mise à jour comme suit:

    def on_show(self): 
        print "addBox // radioButton1.isChecked : ", self.radioButton1.isChecked() 
        if not self.centralwidget.newGroupBox: 
         #self.addBox() 
         self.addwidget_centralwdg(self.globalMainWindow) 
    def addwidget_centralwdg(self,MainWindow): 
        self.centralwidget = QtGui.QWidget(MainWindow) 
        self.globalMainWindow=MainWindow 
        self.centralwidget.setObjectName("centralwidget") 
        self.selectBox() 
        self.addBox() 
        self.connectEvent() 
        MainWindow.setCentralWidget(self.centralwidget) 
    

Espérons que cela peut aider les autres aussi.