打开一个新窗口

时间:2019-03-10 04:14:10

标签: python pyqt pyqt5

我开始使用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编写的,我不确定这两者之间的区别。

1 个答案:

答案 0 :(得分:1)

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

QMainWindow和QWidget有什么区别?

QMainWindow是一个自定义QWidget,具有一些已激活的标志,包括标志Qt::Windowdocs表示:

  

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

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

因此解决方案是在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()