открывать новое окно - PullRequest
1 голос
/ 10 марта 2019

Я начинаю изучать ООП, используя PyQt5, поэтому я пытаюсь создать окно с кнопкой, и когда кнопка нажата, я хочу показать новое окно. Я написал этот код, но он не работает, он просто показывает окно с кнопкой, но кнопка ничего не делает, кажется, что она просто ждет, но это не дает мне никаких ошибок, ни

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

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


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

        self.init_ui()

    def init_ui(self):
        self.btn = QPushButton("Push Me")
        layout = QVBoxLayout()

        layout.addWidget(self.btn)

        self.setLayout(layout)
        self.setWindowTitle("PyQt5 double window")

        self.btn.clicked.connect(self.btn_clk)
        self.newindow = Window2(self)

        self.show()

    def btn_clk(self):
        self.newindow.show()

app = QApplication(sys.argv)
a_window = Window()
sys.exit(app.exec_())

Этот вопрос направил меня PyQT: как открыть новое окно , но оно написано на PyQt4, и я не уверен в разнице между этими двумя.

1 Ответ

1 голос
/ 10 марта 2019

В ответе PyQT: как открыть новое окно использует QMainWindow в отличие от вас, кто использует QWidget.

В чем разница между QMainWindow и QWidget?

QMainWindow - это пользовательский QWidget, в котором активированы некоторые флаги, включая флаг Qt::Window. Как указано в документах указывает:

Указывает, что виджет является окном, обычно с оконной системой рамка и строка заголовка, независимо от того, есть ли у виджета родитель или нет. Обратите внимание, что невозможно сбросить этот флаг, если виджет не имеет родителя.

То есть этот виджет станет окном, даже если у него есть родительский виджет.

Таким образом, решение состоит в том, чтобы активировать этот флаг в Window2:

import sys
from PyQt5 import QtCore, QtWidgets

class Window2(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window2, self).__init__(parent, QtCore.Qt.Window) # <---

class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.init_ui()

    def init_ui(self):
        self.btn = QtWidgets.QPushButton("Push Me")
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.btn)
        self.setWindowTitle("PyQt5 double window")
        self.btn.clicked.connect(self.btn_clk)
        self.newindow = Window2(self)
        self.show()

    def btn_clk(self):
        self.newindow.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    a_window = Window()
    sys.exit(app.exec_())

Другие альтернативные решения:

  • Сделать Window2 наследуемым от QMainWindow или QDialog.

  • Не передавать родительский элемент в Window2: self.newindow = Window2()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...