PyQt mostrar un widget con el botón haciendo clic en otro

votos
1

Soy nuevo en PyQt y el uso de PyQt4. Tener dos widgets independientes. El primero de ellos showFullScreen()y el segundo show(). Quiero después de esconderse en segundo lugar por hide()lo manifiesto en hacer clic en el botón en primer lugar. Intentado algo y buscado en Google - nada. Código completo:

from PyQt4 import QtCore, QtGui


class FileExplorer(QtGui.QWidget):
    def __init__(self, parent=None):
        super(FileExplorer, self).__init__(parent)

        nameLabel = QtGui.QLabel(Name:)
        self.nameLine = QtGui.QLineEdit()

        addressLabel = QtGui.QLabel(Address:)
        self.addressText = QtGui.QTextEdit()

        showButton = QtGui.QPushButton('Show widget', self)
        showButton.clicked.connect(FileExplor.show)

        mainLayout = QtGui.QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addWidget(showButton, 3, 1)

        self.setLayout(mainLayout)
#               self.setGeometry(300, 300, 250, 150)
#        self.sizeHint()
        self.setWindowTitle(File Explorer)




class FileExplor(QtGui.QWidget):
    def __init__(self, parent=None):
        super(FileExplor, self).__init__(parent)

        nameLabel = QtGui.QLabel(Name:)
        self.nameLine = QtGui.QLineEdit()

        addressLabel = QtGui.QLabel(Address:)
        self.addressText = QtGui.QTextEdit()

        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.clicked.connect(self.hide)

        mainLayout = QtGui.QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addWidget(quitButton, 3, 1)

        self.setLayout(mainLayout)
        #self.setGeometry(300, 300, 250, 150)
        self.sizeHint()
        self.setWindowTitle(File Explorer)


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    fileExplorer = FileExplorer()
    fileExplorer.showFullScreen()
#    fileExplorer.show()
#
    fileExplor = FileExplor()
    fileExplor.show()

    sys.exit(app.exec_())

Lógica de lo que quiero hacer en el final:

  • primer widget - bloque principal (pantalla completa)
  • otros widgets - puede ser mostrado por clic en los botones en la primera
Publicado el 20/10/2011 a las 16:11
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

No tengo PyQt4 instalado en este equipo, así que no puedo probar esto. Pero aquí está el problema:

showButton.clicked.connect(FileExplor.show)

Usted no se hace referencia al objeto objetos que se crea a continuación, se hace referencia a la FileExplor objeto de clase.

    fileExplorer = FileExplorer()
    fileExplorer.showFullScreen()

    fileExplor = FileExplor()
    fileExplor.show()

Se puede tratar de hacer FileExplorcomo un argumento de FileExplorer? Además, trate de nombrar a FileExplorotra cosa, como DependentFileExplorer(aprender acerca de convenciones de nombres aquí ) y hacer esto:

from PyQt4 import QtCore, QtGui


class FileExplorer(QtGui.QWidget):
    def __init__(self, dependent, parent=None):
        super(FileExplorer, self).__init__(parent)
        self.dependent = dependent

        nameLabel = QtGui.QLabel("Name:")
        self.nameLine = QtGui.QLineEdit()

        addressLabel = QtGui.QLabel("Address:")
        self.addressText = QtGui.QTextEdit()

        showButton = QtGui.QPushButton('Show widget', self)
        showButton.clicked.connect(self.dependent.show)

        mainLayout = QtGui.QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addWidget(showButton, 3, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("File Explorer")




class DependentFileExplorer(QtGui.QWidget):
    def __init__(self, parent=None):
        super(DependentFileExplorer, self).__init__(parent)

        nameLabel = QtGui.QLabel("Name:")
        self.nameLine = QtGui.QLineEdit()

        addressLabel = QtGui.QLabel("Address:")
        self.addressText = QtGui.QTextEdit()

        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.clicked.connect(self.hide)

        mainLayout = QtGui.QGridLayout()
        mainLayout.addWidget(nameLabel, 0, 0)
        mainLayout.addWidget(self.nameLine, 0, 1)
        mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
        mainLayout.addWidget(self.addressText, 1, 1)
        mainLayout.addWidget(quitButton, 3, 1)

        self.setLayout(mainLayout)
        #self.setGeometry(300, 300, 250, 150)
        self.sizeHint()
        self.setWindowTitle("File Explorer")


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    dependent = DependentFileExplorer()
    fileExplorer = FileExplorer(dependent)

    fileExplorer.showFullScreen()
    dependent.show()

    sys.exit(app.exec_())

Ahora FileExplorer toma DependentFileExplorer como argumento.
Debe crear el DependentFileExplorer antes FileExplorer.

Respondida el 20/10/2011 a las 16:36
fuente por usuario

votos
2

Suena como lo que quiere es un diálogo no modal.

En el código que envió, cambiar la FileExplorclase a una QDialog:

class FileExplor(QtGui.QDialog):

A continuación, añadir un manejador de señales de la principal FileExplorerclase:

def handleShowDialog(self):
    if not hasattr(self, 'dialog'):
        self.dialog = FileExplor(self)
    self.dialog.show()

Y, por último conectar el botón al controlador:

showButton.clicked.connect(self.handleShowDialog)
Respondida el 20/10/2011 a las 17:55
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more