Почему нельзя изменять код, созданный Qt Designer
Мне часто говорили, что нельзя изменять код, созданный Qt Designer, будет не работать.
Я достаточно часто под себя изменяю код, но при этом все идеально работает, без каких-либо ошибок.
Ответы (3 шт):
Почему нельзя, можно надо скомпилировать просто. Файл QtDesigner в .py файл делается это так: pyuic5 -x [ваш файл] -o [ваш файл].py И всё готово.
файл.py выглядит примерно так (кусочек кода):
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1120, 885)
font = QtGui.QFont()
font.setFamily("Arial")
MainWindow.setFont(font)
MainWindow.setAutoFillBackground(True)
MainWindow.setStyleSheet("")
MainWindow.setAnimated(True)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 651, 521))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.frame = QtWidgets.QFrame(self.tab)
self.frame.setGeometry(QtCore.QRect(0, 0, 651, 501))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.label_4 = QtWidgets.QLabel(self.frame)
self.label_4.setGeometry(QtCore.QRect(110, 250, 251, 51))
font = QtGui.QFont()
font.setFamily("Georgia")
font.setPointSize(42)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label = QtWidgets.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(110, 90, 241, 61))
font = QtGui.QFont()
font.setFamily("Georgia")
font.setPointSize(42)
self.label.setFont(font)
self.label.setObjectName("label")
self.pushButton_2 = QtWidgets.QPushButton(self.frame)
self.pushButton_2.setGeometry(QtCore.QRect(30, 170, 71, 71))
Но с другой стороны так делать просто неудобно
Вообще менять можно (код-то работать будет), но настоятельно не рекомендуется. И вот почему.
Представим ситуацию: вы создали приложение, изменили код, созданный через QtDesigner. А потом вам/заказчику захотелось изменений в интерфейсе будь то новые возможности ПО или просто дизайн. Вы меняете старый интерфейс на новый в QtDesigner и вам теперь придется снова менять новый сгенерированный файл. Это займет много времени и, скорее всего, приведет к ошибкам в коде.
А теперь представим то же приложение, но вы не меняли файл, а импортировали его и написали "обертку". Тогда вам просто нужно:
- при чисто дизайновом (косметическом) изменение приложения - изменить дизайн в QtDesigner
- при добавлении нового функционала: дописать новый функционал в обертку, изменить интерфейс в QtDesigner.
Как видите, действий во втором случае гораздо меньше, плюс используется принцип повторного использования, что дает выгоду и во времени и в качестве разработки.
Как говорится в предупреждении в заголовке всех сгенерированных pyuic файлов,
вам не следует редактировать их, если вы действительно не знаете, что делаете.
И если вы знаете, что делаете, вы не будете их редактировать.
Это вежливый способ сказать: вы никогда не должны редактировать эти файлы.
То, что генерирует утилита pyuic, всегда должно использоваться
как импортированный модуль, и его никогда нельзя редактировать
или использовать в качестве отправной точки для вашей программы.
Рассматривайте его как файл ресурсов (как изображение или данные json);
см. документацию об этом.
Для этого есть несколько причин, наиболее важная из которых заключается в том, что всякий раз, когда вы редактируете файл пользовательского интерфейса, созданный в Designer, вам придется объединять свой код с кодом из нового сгенерированного файла py, что, вероятно, приведет к неожиданному результату или, в большинстве случаев головная боль возникает из-за расхождений между написанным вами логическим кодом и модификациями, которые вы внесли в графический интерфейс.