我开始使用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编写的,我不确定这两者之间的区别。
答案 0 :(得分: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
继承自QMainWindow
或QDialog
。
不要将父项传递给Window2:self.newindow = Window2()