簡體   English   中英

PyQt從QtDesigner生成的MainWindow打開一個新的Windowed Widget

[英]PyQt opening a new Windowed Widget from a MainWindow generated from QtDesigner

情況如下:

  • 我有一個MainWindow和一個Widget
  • MainWindow和Widget是從QtDesigner創建的。
  • Mainwindow有一個按鈕,可以打開Widget。
  • 我通過pyuic傳遞了*.ui文件,以使它們變成更加pythonic的形式。
  • 然后我將MainWindow子類化,這樣我就可以在按鈕上添加一個觸發器來調用我的Widget

當我點擊MainWindow中的按鈕時,最終目標是讓Widget出現在一個新窗口中,但是窗口關閉時exit code -1

這是代碼的樣子。 我通過添加main()函數稍微修改了ExampleWidget.py

# MainWindow.py

from PyQt5 import QtCore, QtGui, QtWidgets
from ui.ExampleWidget import main
from ui.ExampleMainWindow import Ui_MainWindow

class Ui_MainWindow(Ui_MainWindow):
    def setupUi(self, MainWindow):
        super().setupUi(MainWindow)
        self.pushButton.clicked.connect(main)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

# ExampleWidget.py

from PyQt5 import QtCore, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(Form)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(("Form"))
        self.label.setText(("It worked"))


def main():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

您的代碼有幾個錯誤,您繼承的類與父代碼具有相同的名稱是不正確的。 另一個錯誤是只有一個QApplication,因為它創建了一個GUI所在的循環,當你按下按鈕並調用main() ,你創建了另一個阻塞初始循環的循環。

建議不要使用Qt Designer生成的類,因為它不是小部件,我們無法處理某些事件,所以適合實現使用該設計的小部件。

根據你的代碼,我可以假設Qt Designer生成的類是Ui_MainWindow和Ui_Form,它們分別位於文件ExampleMainWindow和ExampleWidget中,並且都位於ui文件夾中。 然后,您必須以下列方式實現類:

from PyQt5 import QtCore, QtGui, QtWidgets
from ui.ExampleWidget import Ui_Form
from ui.ExampleMainWindow import Ui_MainWindow

class Form(QtWidgets.QWidget, Ui_Form):
    def __init__(self, *args, **kwargs):
        QtWidgets.QWidget.__init__(self, *args, **kwargs)
        self.setupUi(self)

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.onClicked)

    def onClicked(self):
        self.form = Form()
        self.form.show()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

暫無
暫無

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

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