Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt5]Ubicar botones u otros widgets en diversas partes
#1
Hola, tengo un código que crea un reproductor de video.
Lo que pasa es que quiero crear otro botón (ya hay un boton, que es el de play), pero quiero ubicarlo abajo de ese botón, ya que ahora lo esta colocando al lado del boton de play.
El botón ya está creado, es fullSCR

Código:
[code]
class VideoWindow(QMainWindow):

   def __init__(self, parent=None):
       super(VideoWindow, self).__init__(parent)

       # Customizing window
       self.setWindowTitle('Video')
       self.setWindowIcon(QIcon('vid_icon.svg'))
       setwinicon()

       # Starting media player
       self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
       videoWidget = QVideoWidget()

       self.playButton = QPushButton()
       self.playButton.setEnabled(False)
       self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
       self.playButton.clicked.connect(self.play)

       self.fullSCR = QPushButton()
       self.fullSCR.setEnabled(True)
       #self.fullSCR.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
       self.fullSCR.clicked.connect(self.t_fullscreen)


       self.positionSlider = QSlider(Qt.Horizontal)
       self.positionSlider.setRange(0, 0)
       self.positionSlider.sliderMoved.connect(self.setPosition)

       self.errorLabel = QLabel()
       self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                     QSizePolicy.Maximum)

       # Create new action
       openAction = QAction(QIcon('icons/16x16/actions/document-open.png'), \n                             '&Open', self)
       openAction.setShortcut('Ctrl+O')
       openAction.setStatusTip('Open movie')
       openAction.triggered.connect(self.openFile)

       # Create exit action
       exitAction = QAction(QIcon('icons/16x16/actions/system-log-out.png'), \n                             '&Exit', self)
       exitAction.setShortcut('Ctrl+Q')
       exitAction.setStatusTip('Exit application')
       exitAction.triggered.connect(self.exitCall)

       changeresAction = QAction(QIcon('icons/16x16/apps/help-browser.png'), \n                                  '&Change resolution', self)

       # aboutAction.setShortcut('')

       aboutAction = QAction(QIcon('icons/16x16/apps/help-browser.png'), \n                              '&About...', self)
       aboutAction.setShortcut('Ctrl+I')
       aboutAction.setStatusTip('About video')
       aboutAction.triggered.connect(self.about)

       fullscreenAction = QAction(QIcon('icons/16x16/devices/video_icon.png'), \n                                   '&Enter fullscreen', self)
       fullscreenAction.setShortcut('F11')
       fullscreenAction.setStatusTip('Toggle fullscreen mode')
       fullscreenAction.triggered.connect(self.t_fullscreen)

       self.playAction = QAction(QIcon('icons/16x16/actions/media-playback-start.png'), \n                                  '&Play', self)
       # playAction.setShortcut('')
       self.playAction.triggered.connect(self.playnp)
       self.playAction.setEnabled(False)

       self.pauseAction = QAction(QIcon('icons/16x16/actions/media-playback-pause.png'), \n                                   '&Pause', self)
       # playAction.setShortcut('')
       self.pauseAction.triggered.connect(self.pausenp)
       self.pauseAction.setEnabled(False)

       # Create menu bar and add action
       self.menuBar = self.menuBar()
       fileMenu = self.menuBar.addMenu('&File')
       # fileMenu.addAction(newAction)
       fileMenu.addAction(openAction)
       fileMenu.addAction(exitAction)

       playbackMenu = self.menuBar.addMenu('&Playback')
       playbackMenu.addAction(self.playAction)
       playbackMenu.addAction(self.pauseAction)

       toolsMenu = self.menuBar.addMenu('&Tools')
       toolsMenu.addAction(fullscreenAction)
       self.chgresm = toolsMenu.addMenu('Change resolution')
       self.chgresm.setEnabled(False)
       chgres43 = self.chgresm.addAction('4:3')
       chgres169 = self.chgresm.addAction('16:9')
       # changeresAction.setStatusTip('Change resolution')
       chgres43.triggered.connect(self.screen43)
       chgres169.triggered.connect(self.screen169)

       helpMenu = self.menuBar.addMenu('&Help')
       helpMenu.addAction(aboutAction)

       # Create a widget for window contents
       wid = QWidget(self)
       self.setCentralWidget(wid)

       # Create layouts to place inside widget
       controlLayout = QHBoxLayout()
       controlLayout.setContentsMargins(0, 0, 0, 0)
       controlLayout.addWidget(self.playButton)
       controlLayout.addWidget(self.fullSCR)
       controlLayout.addWidget(self.positionSlider)

       layout = QVBoxLayout()
       layout.addWidget(videoWidget)
       layout.addLayout(controlLayout)
       layout.addWidget(self.errorLabel)

       # Set widget to contain window contents
       wid.setLayout(layout)

       self.mediaPlayer.setVideoOutput(videoWidget)
       self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
       self.mediaPlayer.positionChanged.connect(self.positionChanged)
       self.mediaPlayer.durationChanged.connect(self.durationChanged)
       self.mediaPlayer.error.connect(self.handleError)

   def t_fullscreen(self):
       if self.windowState() & Qt.WindowFullScreen:
           self.showNormal()
           #self.menuBar.setVisible(True)
           loginfo(infotype="i", cstr="No fullscreen")
       else:
           self.showFullScreen()
           #self.menuBar.setVisible(False)
           loginfo(infotype="i", cstr="Fullscreen entered")

   def exitCall(self):
       loginfo(infotype="i", cstr="Good bye!")
       sys.exit(app.exec_())

   def play(self):
       if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
           self.mediaPlayer.pause()
           self.pauseAction.setEnabled(False)

       else:
           self.mediaPlayer.play()
           self.pauseAction.setEnabled(True)

   def playnp(self):
       if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
           pass

       else:
           self.mediaPlayer.play()
           self.pauseAction.setEnabled(True)
           self.playAction.setEnabled(False)

   def pausenp(self):
       if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
           self.mediaPlayer.pause()
           self.playAction.setEnabled(True)
           self.pauseAction.setEnabled(False)

       else:
           pass


   def openFile(self):
       fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                                                 QDir.homePath(), """Videos (*.mp4 *.avi *.wmv *.mpeg *.mpg *.mkv *.webm *.m4v *.ogg *.ts)
                                   Music (*.mp3 *.mp2 *.ogg *.flac *.wav *.m4a)
                                   Images (*.png *.jpeg *.jpg *.gif *.bmp)
                                   Subtitles (*.sub)
                                   All files (*)""")

       # fileName = "C:/Users/nicol/Desktop/Mikel Erentxun - A Un Minuto De Ti (video clip).mp4"
       if fileName != '':
           self.mediaPlayer.setMedia(
               QMediaContent(QUrl.fromLocalFile(fileName)))
           self.playButton.setEnabled(True)
           self.playAction.setEnabled(False)
           self.chgresm.setEnabled(True)

       fileName, fileExt = os.path.splitext(fileName)

       if fileExt == '.sub':
           pass

       loginfo(infotype="i", cstr="File opened: %s" % fileName)
       self.setWindowTitle("Video - %s" % fileName)

       if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
           self.mediaPlayer.pause()
           self.pauseAction.setEnabled(False)

       else:
           self.mediaPlayer.play()
           self.pauseAction.setEnabled(True)


   def keyPressEvent(self, e):
       if e.key() == Qt.Key_Space:
           if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
               self.mediaPlayer.pause()
               self.playAction.setEnabled(True)
               self.pauseAction.setEnabled(False)

           else:
               self.mediaPlayer.play()
               self.pauseAction.setEnabled(True)
               self.playAction.setEnabled(False)

       if e.key() == Qt.Key_F11:
           self.t_fullscreen()


   def about(self):
       msglo = (
           '''
       By konniskatt
           ''')
       QMessageBox.about(self, "About video app", msglo)


   def mediaStateChanged(self, state):
       if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
           self.playButton.setIcon(
               self.style().standardIcon(QStyle.SP_MediaPause))
       else:
           self.playButton.setIcon(
               self.style().standardIcon(QStyle.SP_MediaPlay))


   def positionChanged(self, position):
       self.positionSlider.setValue(position)


   def durationChanged(self, duration):
       self.positionSlider.setRange(0, duration)


   def setPosition(self, position):
       self.mediaPlayer.setPosition(position)


   def handleError(self):
       self.playButton.setEnabled(False)
       loginfo(infotype="e", cstr="^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")


   def screen169(self):
       self.widescreen = True
       mwidth = self.frameGeometry().width()
       mheight = self.frameGeometry().height()
       mleft = self.frameGeometry().left()
       mtop = self.frameGeometry().top()
       mratio = 1.778
       self.setGeometry(mleft, mtop, mwidth, mwidth / mratio)

   def screen43(self):
       self.widescreen = False
       mwidth = self.frameGeometry().width()
       mheight = self.frameGeometry().height()
       mleft = self.frameGeometry().left()
       mtop = self.frameGeometry().top()
       mratio = 1.33
       self.setGeometry(mleft, mtop, mwidth, mwidth / mratio)
[/code]
También tengo otros problemas, pj: la slidebar para controlar, si el usuario quiere cambiar la posición, hay que agarrar con el mouse el cuadrado de la slidebar, sin embargo no debería ser así, el usuario simplemente debería dar click en el lugar donde se quiera mover la slidebar (espero que se entienda) y también el QVideoWidget no se extiende completamente por la pantalla, queda unas pequeñas barras, (que son del fondo de la ventana)
Saludos
Responder
#2
Hola. Tus botones aparecen uno al lado del otro porque los estás colocando dentro de un layout horizontal (QHBoxLayout). Tendrías que fijarte cómo combinarlo con un layout vertical para conseguir el resultado que pretendés. De todas maneras usar layouts no es obligatorio, podés establecer la posición de tus elementos de forma absoluta (es decir, en un punto X, Y).

Te dejo este código de un reproductor en PyQt 4 y 5: https://recursospython.com/codigos-de-fu...eo-pyqt-4/.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)