我使用QtDesinger设计GUI以用于python,在QtDesigner中设计我想要的UI后,将其转换为python代码,然后我更改生成的代码以在我的python代码中执行一些操作,但是如果我用QtDesigner更改UI并再次将其转换为python代码,我就失去了之前对代码所做的更改。
我怎样才能解决问题呢?
我们是否可以在python中将一个类分散到多个文件上,从而在其他文件中编写代码?
为了避免出现这些问题,建议不要修改这个文件,而是创建一个新文件,在该文件中实现使用该设计的类。
例如,假设您在design.ui
文件中使用了mainwindow
模板,然后将其转换为ui_design.py
,类似于以下结构:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
[...]
def retranslateUi(self, MainWindow):
[...]
然后,我们将创建一个新文件,我们将调用该文件logic.py
,在该文件中,我们将创建处理逻辑并使用先前设计的文件:
class Logic(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
因此,即使您修改设计并再次生成文件。py,您也不必修改逻辑文件。
为了推广这个概念,我们必须有以下规则,但为此,逻辑类必须有以下结构:
class Logic(PyQtClass, DesignClass):
def __init__(self, *args, **kwargs):
PyQtClass.__init__(self, *args, **kwargs)
self.setupUi(self)
Template PyQtClass
─────────────────────────────────────────────
Main Window QMainWindow
Widget QWidget
Dialog with Buttons Bottom QDialog
Dialog with Buttons Right QDialog
Dialog with Without Buttons QDialog
这种实现的好处是,由于它是一个小部件,所以您可以实现所有的逻辑,例如,我们将实现使用父窗口的closeevent关闭pyqt messageBox的解决方案:
class Logic(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
def closeEvent(self, event):
answer = QtWidgets.QMessageBox.question(
self,
'Are you sure you want to quit ?',
'Task is in progress !',
QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if answer == QtWidgets.QMessageBox.Yes:
event.accept()
else:
event.ignore()
最简单的方法是直接在python代码中使用*.ui文件,不需要每次更改UI时都转换为*.py文件。 您可以在项目中使用此伪代码。
# imports
from PyQt5 import uic
# load ui file
baseUIClass, baseUIWidget = uic.loadUiType("MainGui.ui")
# use loaded ui file in the logic class
class Logic(baseUIWidget, baseUIClass):
def __init__(self, parent=None):
super(Logic, self).__init__(parent)
self.setupUi(self)
.
.
.
.
def main():
app = QtWidgets.QApplication(sys.argv)
ui = Logic(None)
ui.showMaximized()
sys.exit(app.exec_())