2016-04-15 1 views
0

Actuellement, j'essaie d'ajouter une classe QWidget personnalisée à un QVBoxLayout. Le problème que j'obtiens est que le widget n'apparaît pas du tout dans la mise en page. J'ai même essayé de définir la taille minimale de QWidget parce que je pensais que le widget ne s'affichait pas parce que sa taille par défaut était zéro.PyQt5 ajoute QWidget personnalisé à QLayout

Ceci est une simplification de ce que la classe ressemble à:

class myWidget(QWidget): 

    def __init__(self): 
     super().__init__() 

     # Slider 
     self.mySlider = QSlider(Qt.Horizontal) 
     self.mySlider.setRange(-360, 360) 

     # LCD Screen 
     self.lcd = QLCDNumber() 
     self.lcd.setMinimumHeight(45) 
     self.lcd.setMaximumHeight(75) 

     # set Size 
     self.setMinimumSize(QSize(400,300)) 

J'ai enlevé les signaux et les créneaux horaires effectués entre le curseur et l'écran LCD parce que je ne suis pas inquiet au sujet de la fonctionnalité ici. Seul le fait que je reçois une zone grise de QSize (400300) directement entre les deux boutons dans le code suivant:

class MainWindow(QMainWindow): 

    def __init__(self): 
     super().__init__() 

     #Create Widgets to be Added to Central Widget 
     self.w1 = QPushButton("First") 
     self.w2 = myWidget() 
     self.w3 = QPushButton("Third") 

     #Set Central Widget and VBox 
     self.central_widget = QWidget() 
     self.setCentralWidget(self.central_widget) 
     self.layout = QVBoxLayout() 
     self.central_widget.setLayout(self.layout) 

     #Add widgets 
     self.layout.addWidget(self.w1) 
     self.layout.addWidget(self.w2) 
     self.layout.addWidget(self.w3) 

Donc ce que je suis tout simplement faire est de créer les 3 widgets, et en les plaçant dans le QVBoxLayout dans le widget central. Les widgets 2 boutons w1 et w3 apparaissent mais mon widget personnalisé n'apparaît pas et l'augmentation de la taille du widget via setMinimumSize ajoute uniquement l'espacement gris entre w1 et w3.

Donc, le widget est là, il n'est tout simplement pas visible pour une raison quelconque. Je suis assez nouveau à PyQt alors s'il vous plaît expliquer pourquoi cela est arrivé.

Répondre

3

QWidgets sont juste des conteneurs pour d'autres widgets. Un QWidget sans aucune mise en page et sous-widgets ressemblera à l'espace vide sauf si vous faites de la peinture ou un style personnalisé. Dans votre exemple, , vous n'ajoutez aucun sous-widget à votre widget personnalisé. Pour ajouter un subwidget à un autre widget, vous devez soit régler le parent du subwidget, ou ajouter subwidget à la mise en page du widget parent (qui re-parents automatiquement le SubWidget)

class myWidget(QWidget): 

    def __init__(self): 
     super().__init__() 

     # Slider 
     self.mySlider = QSlider(Qt.Horizontal) 

Ici, vous créez un QSlider, mais il n'appartient pas réellement à MyWidget, il finira par appartenir à Qt, et je m'attendrais à ce qu'il soit dessiné dans le coin supérieur gauche de votre fenêtre principale.

Afin de faire de ce sous-widget MyWidget vous devez définir le parent et l'ajouter à une mise en page.

class myWidget(QWidget): 

    def __init__(self): 
     super().__init__() 

     self.myLay = QVBoxLayout() 
     self.setLayout(self.myLay) 

     # Notice self is being passed in to set the parent 
     self.mySlider = QSlider(Qt.Horizontal, self) 

     # You need to add widgets to a layout to position them properly 
     self.myLay.addWidget(self.mySlider)