更新 python ui 而无需重写所有按钮事件

问题描述 投票:0回答:2

我正在寻找一种更好的方法来处理来自 QtDesigner 的 python UI“更新”而不覆盖按钮事件。我现在得到的工作流程是:

  1. 在 QtDesigner 中设计 UI 布局
  2. 通过 pyuic5 将 .ui 转换为 .py
  3. 在.py文件中添加按钮事件
  4. 执行 .py 以查看窗口和按钮操作

因此,如果我的 UI 不断更改设计,如何保留添加到 .py 中的所有按钮事件,而不在转换后被覆盖?谢谢。

python
2个回答
4
投票

回答我自己的问题,我发现有三个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"))

0
投票

我的五美分:理论上只需要一个

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)

© www.soinside.com 2019 - 2024. All rights reserved.