我定义了一个简单的主窗口和第二个弹出窗口。当我调用 MainWindow.create_new_window() 方法时,SecondWindow 不会显示为新窗口,但它的 QLabel 是在 MainWindow 实例中创建的。代码如下:
import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QLabel, QWidget, QVBoxLayout
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.second_window = None
self.main_layout = QVBoxLayout(self)
self.new_window_button = QPushButton('New Window', self)
self.new_window_button.clicked.connect(self.create_new_window)
self.main_layout.addWidget(self.new_window_button)
def create_new_window(self):
if self.second_window is None:
self.second_window = SecondWindow(self)
self.second_window.show()
class SecondWindow(QWidget):
def __init__(self, *args, **kwargs):
super(SecondWindow, self).__init__(*args, **kwargs)
self.main_layout = QVBoxLayout(self)
self.hello_label = QLabel('Hello I am the second window.', self)
self.main_layout.addWidget(self.hello_label)
if __name__ == '__main__':
app = QApplication(sys.argv)
mainwin = MainWindow()
mainwin.show()
sys.exit(app.exec_())
当我创建第二个窗口而未将 MainWindow 实例指定为父窗口 (self.second_window = SecondWindow()
) 时,它会按预期打开。谁能告诉我这是怎么回事?
最佳答案
默认情况下,具有父级的 QWidget 意味着该小部件将放置在父级内,因此您可以观察到该行为。
如果你希望它成为一个窗口,那么你必须激活标志 Qt::Window
# ...
from PyQt5.QtCore import Qt
# ...
class SecondWindow(QWidget):
def __init__(self, *args, **kwargs):
super(SecondWindow, self).__init__(*args, **kwargs)
self.setWindowFlags(self.windowFlags() | Qt.Window) # <---
# ...
其他选项是使用 QDialog,它是一种小部件,默认情况下已激活该标志,其目的是向用户询问信息。
关于python - 当指定父窗口时,PyQt5 窗口未在 show() 上打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56067373/