簡體   English   中英

打開一個新窗口

[英]opening a new window

我開始使用 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的回答中:如何打開新窗口是使用 QMainWindow 與使用 QWidget 的您不同。

QMainWindow 和 QWidget 有什么區別?

QMainWindow是一個自定義的QWidget ,它有一些標志被激活,包括標志Qt::Window 文檔所示:

表示widget是一個窗口,通常有一個窗口系統框架和一個標題欄,不管widget是否有父級。 請注意,如果小部件沒有父級,則無法取消設置此標志。

也就是說,即使該小部件具有父小部件,它也會成為一個窗口。

所以解決方案是在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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM