打开一个新窗口

问题描述 投票:1回答:1

我开始使用PyQt5学习OOP,所以我试图用按钮创建一个窗口,当点击按钮时,我想显示一个新窗口。我写了这段代码,但它不起作用,它只显示带有按钮的窗口,但按钮没有做任何事情,似乎它只是等待,但它不会给我任何错误

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: how to open new window,但它是用PyQt4编写的,我不确定这两者之间的差异。

python pyqt pyqt5
1个回答
1
投票

PyQT: how to open new window的答案中使用QMainWindow与使用QWidget的人不同。

QMainWindow和QWidget有什么区别?

QMainWindow是一个自定义的QWidget,有一些标志激活,包括国旗Qt::Window。正如docs所示,表明:

表示窗口小部件是一个窗口,通常具有窗口系统框架和标题栏,无论窗口小部件是否具有父窗口。请注意,如果窗口小部件没有父标记,则无法取消设置此标记。

也就是说,即使它具有父窗口小部件,该窗口小部件也将成为窗口。

因此解决方案是在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继承自QMainWindowQDialog
  • 不要将父级传递给Window2:self.newindow = Window2()
© www.soinside.com 2019 - 2024. All rights reserved.