PyQt показывает один виджет, нажимая кнопку на другом

#python #pyqt #qwidget

#python #pyqt #qwidget

Вопрос:

Я новичок в PyQt и использую PyQt4. Есть два независимых виджета. Первый из них showFullScreen() и второй show() . Я хочу после скрытия второго hide() показать его, нажав кнопку на первом. Попробовал что-то и погуглил — ничего. Полный код:

 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_())
 

Логика того, что я хочу сделать в конце:

  • первый виджет — основной блок (полноэкранный режим)
  • другие виджеты — можно показать, нажав кнопки в первом

Ответ №1:

Похоже, вам нужен немодальный диалог.

В опубликованном вами коде измените FileExplor класс на QDialog :

 class FileExplor(QtGui.QDialog):
 

Затем добавьте обработчик сигналов в основной FileExplorer класс:

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

И, наконец, подключите кнопку к обработчику:

 showButton.clicked.connect(self.handleShowDialog)
 

Ответ №2:

У меня на этом компьютере не установлен PyQt4, поэтому я не могу это протестировать. Но вот ваша проблема:

 showButton.clicked.connect(FileExplor.show)
 

Вы ссылаетесь не на объект виджета, созданный ниже, вы ссылаетесь на объект класса FileExplor .

     fileExplorer = FileExplorer()
    fileExplorer.showFullScreen()

    fileExplor = FileExplor()
    fileExplor.show()
 

Можете ли вы попробовать использовать FileExplor в качестве аргумента FileExplorer ?
Кроме того, попробуйте FileExplor назвать что-то еще, например DependentFileExplorer (узнайте о соглашениях об именовании здесь) и сделайте это:

 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_())
 

Теперь FileExplorer принимает DependentFileExplorer в качестве аргумента.
Вы должны создать DependentFileExplorer перед FileExplorer.