【问题标题】:opening a new window打开一个新窗口
【发布时间】:2019-03-10 04:14:10
【问题描述】:

我开始使用 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】:

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

    【讨论】:

    • 谢谢。所以我想为了让第二个窗口像一个窗口一样,我必须激活一个标志,说它是一个窗口,对吧?当我点击按钮调用它们时,我可以使用哪些类型的小部件而不会出现问题?还是仅当我将窗口视为小部件时才会发生这种情况?
    • @LissethMartínez 在我提供的代码中是标志的激活。正如我在替代解决方案中指出的那样,QDialog 和 QMainWindow 已经激活了该标志。
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2011-04-06
    • 2020-03-23
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多