我开始使用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编写的,我不确定这两者之间的差异。
在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
继承自QMainWindow
或QDialog
。self.newindow = Window2()