2017-06-11 2 views
0

Ich habe ein einfaches Fenster, die einen Sound reproduzieren sollten, und wenn ich die QPushButton erstellen, zeigt sie in der linken oberen Ecke wie es sollte, aber wenn ich die move() über irgendeinen von ihnen, sie erscheinen einfach nicht im Fenster.QPushButon nicht zeigen, wenn Bewegung() -Methode PyQt5

class MainWindow(QMainWindow): 
def __init__(self): 
    super().__init__() 
    self.setup() 
def setup(self): 
    self.musica = QSound('sounds/gorillaz.mp3') 
    self.centralwidget = QWidget(self) 
    self.boton = QPushButton(self.centralwidget) 
    self.boton.setText('Reproducir') 
    # self.boton.move(300, 100) 
    self.boton2 = QPushButton(self.centralwidget) 
    self.boton2.clicked.connect(self.musica.play) 
    self.boton2.setText('DETENER') 
    self.boton2.move(400, 100) 
    self.boton2.clicked.connect(self.musica.stop) 
    self.setWindowTitle('PrograPoP') 
    self.resize(750,600) 

Warum passiert das? Vielleicht gibt es eine andere Methode, die ich verwenden sollte?

Antwort

0

Vielleicht gibt es eine andere Methode, die ich verwenden sollte?

Ja, Sie sollten fast immer Qt's layout mechanism verwenden. Ich habe Ihr Beispiel unten umgewandelt:

#!/usr/bin/env python #in newer versions is not necesarry I think, but it's always worth doing 

from PyQt5.QtWidgets import (QApplication, QWidget, 
    QPushButton, QMainWindow, QVBoxLayout, QHBoxLayout) 
from PyQt5.QtMultimedia import QSound 

class MainWindow(QMainWindow): 
def __init__(self): 
    super().__init__() 
    self.setup() 

def setup(self): 
    self.musica = QSound('sounds/gorillaz.mp3') 
    self.mainWidget = QWidget(self) 
    self.setCentralWidget(self.mainWidget) 

    self.mainLayout = QVBoxLayout() 
    self.mainWidget.setLayout(self.mainLayout) 

    self.mainLayout.addSpacing(100) # Add some empty space above the buttons. 
    self.buttonLayout = QHBoxLayout() 
    self.mainLayout.addLayout(self.buttonLayout) 

    self.boton = QPushButton(self.mainWidget) 
    self.boton.setText('Reproducir') 
    #self.boton.move(300, 100) 
    self.buttonLayout.addWidget(self.boton) 
    self.boton2 = QPushButton(self.mainWidget) 
    self.boton2.clicked.connect(self.musica.play) 
    self.boton2.setText('DETENER') 
    #self.boton2.move(400, 100) 
    self.buttonLayout.addWidget(self.boton2) 
    self.boton2.clicked.connect(self.musica.stop) 
    self.setWindowTitle('PrograPoP') 
    self.resize(750,600) 

def main(): 
    app = QApplication([]) 

    win = MainWindow() 
    win.show() 
    win.raise_() 
    app.exec_() 

if __name__ == "__main__": 
    main() 

Beachten Sie, dass ich Ihre centralWidget zu mainWidget, da sonst die Linie umbenannt self.centralWidget = QWidget(self) die QMainWindow.centralWidget Methodendefinition außer Kraft gesetzt, mit dem Sie einen Fehler geben wird.

+0

Danke, das ist großartig, aber wenn ich zu einer bestimmten Pixelposition bewegen muss? Und kann ich mehr als ein Layout in einem Widget haben? Denn soweit ich weiß, ist die von Ihnen angewendete Methode horizontal. – gramsch

+0

Die Position (und Größe) Ihres Widgets hängt normalerweise von der Größe des Fensters ab. Ohne die Verwendung von Layouts müssen Sie dies bei jeder Änderung des Fensters neu berechnen. Das ist die Funktionalität, die Layouts Ihnen bieten und deshalb verwenden Sie sie (fast) immer. Sie können verschachtelte Layouts mit der Methode 'addLayout' verwenden. Ich habe mein Beispiel aktualisiert. Andere Optionen sind die Verwendung eines 'QGridLayout' – titusjan