我正在寻找一种更好的方法来处理来自 QtDesigner 的 python UI“更新”而不覆盖按钮事件。我现在得到的工作流程是:
因此,如果我的 UI 不断更改设计,如何保留添加到 .py 中的所有按钮事件,而不在转换后被覆盖?谢谢。
回答我自己的问题,我发现有三个python文件。 Main.py、CallUI.py 和 MainWindow.py。 (按你想要的命名。) 因此,您可以继续重新生成 UI 并覆盖 MainWindow.py,而无需清除您编写的按钮事件。
1.Main.py 是启动所有内容的那个,名称==“main”。调用CAllUI.py的setup函数。
#Main.py
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import CallUI
def setUp():
CallUI.setUpWindow()
raw_input()
if __name__ == "__main__":
setUp()
2.CallUI.py是使用“QtWidgets.QApplication(sys.argv)”来显示UI并添加按钮点击功能的。
#CallUI.py
import sys
from MainWindow import Ui_Dialog
from PyQt5 import QtCore, QtGui, QtWidgets
import os
class CallUI(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.setUpBtnconnect()
def setUpBtnconnect(self):
self.ui.pushButton.clicked.connect(self.myFunction)
def myFunction(self):
os.system("ipconfig")
raw_input()
def setUpWindow():
app = QtWidgets.QApplication(sys.argv)
nowWindow = CallUI()
nowWindow.show()
sys.exit(app.exec_())
3.MainWindow.py是你从pyuic5转换而来的,它描述了所有的UI布局。
#MainWindow.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("MainWindow")
Dialog.resize(466, 417)
self.centralwidget = QtWidgets.QWidget(Dialog)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(160, 260, 75, 23))
self.pushButton.setObjectName("pushButton")
self.menubar = QtWidgets.QMenuBar(Dialog)
self.menubar.setGeometry(QtCore.QRect(0, 0, 466, 21))
self.menubar.setObjectName("menubar")
self.statusbar = QtWidgets.QStatusBar(Dialog)
self.statusbar.setObjectName("statusbar")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
self.pushButton.setText(_translate("MainWindow", "PushButton"))
我的五美分:理论上只需要一个
py.file
即可完成任务,通过使用 uic
库中的 PyQt5
来动态地将这些配置打包到 ui.file
中。
最小脚本可以写成如下:
from PyQt5 import QtWidgets, uic
class end_gui(object):
def __init__(self, app):
self.app = app
self.ui = uic.loadUi("test.ui")
self.ui.xxxxxx
self.ui.show()
self.run()
def run(self):
self.app.exec_()
### subject to change according to the developer's intention
def functionA(self):
pass
###
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
end_gui(app)
所有的小部件都可以通过
__init__(self, app)
在 self.ui.xxxxxx
方法中调用,其中 xxxxxx
应该是 Qt 设计器中这些小部件的 objectName
,后面是我们想要实现的小部件的交互。例如:self.ui.button1.clicked.connect(self.functionA)