gpt4 book ai didi

python - PyQt 从 QtDesigner 生成的 MainWindow 打开一个新的 Windowed Widget

转载 作者:行者123 更新时间:2023-11-28 18:17:20 24 4
gpt4 key购买 nike

情况是这样的:

  • 我有一个 MainWindow 和一个 Widget
  • MainWindow 和 Widget 是从 QtDesigner 创建的。
  • 主窗口有一个按钮可以打开小部件。
  • 我通过 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_())

关于python - PyQt 从 QtDesigner 生成的 MainWindow 打开一个新的 Windowed Widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47544669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com