Почему нельзя изменять код, созданный Qt Designer

Мне часто говорили, что нельзя изменять код, созданный Qt Designer, будет не работать.
Я достаточно часто под себя изменяю код, но при этом все идеально работает, без каких-либо ошибок.


Ответы (3 шт):

Автор решения: Aix Play

Почему нельзя, можно надо скомпилировать просто. Файл 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))

Но с другой стороны так делать просто неудобно

→ Ссылка
Автор решения: n1tr0xs

Вообще менять можно (код-то работать будет), но настоятельно не рекомендуется. И вот почему.

Представим ситуацию: вы создали приложение, изменили код, созданный через QtDesigner. А потом вам/заказчику захотелось изменений в интерфейсе будь то новые возможности ПО или просто дизайн. Вы меняете старый интерфейс на новый в QtDesigner и вам теперь придется снова менять новый сгенерированный файл. Это займет много времени и, скорее всего, приведет к ошибкам в коде.

А теперь представим то же приложение, но вы не меняли файл, а импортировали его и написали "обертку". Тогда вам просто нужно:

  1. при чисто дизайновом (косметическом) изменение приложения - изменить дизайн в QtDesigner
  2. при добавлении нового функционала: дописать новый функционал в обертку, изменить интерфейс в QtDesigner.

Как видите, действий во втором случае гораздо меньше, плюс используется принцип повторного использования, что дает выгоду и во времени и в качестве разработки.

→ Ссылка
Автор решения: S. Nick

Как говорится в предупреждении в заголовке всех сгенерированных pyuic файлов, вам не следует редактировать их, если вы действительно не знаете, что делаете. И если вы знаете, что делаете, вы не будете их редактировать. Это вежливый способ сказать: вы никогда не должны редактировать эти файлы.

То, что генерирует утилита pyuic, всегда должно использоваться как импортированный модуль, и его никогда нельзя редактировать или использовать в качестве отправной точки для вашей программы. Рассматривайте его как файл ресурсов (как изображение или данные json); см. документацию об этом.

Для этого есть несколько причин, наиболее важная из которых заключается в том, что всякий раз, когда вы редактируете файл пользовательского интерфейса, созданный в Designer, вам придется объединять свой код с кодом из нового сгенерированного файла py, что, вероятно, приведет к неожиданному результату или, в большинстве случаев головная боль возникает из-за расхождений между написанным вами логическим кодом и модификациями, которые вы внесли в графический интерфейс.

→ Ссылка