PyQt5. Как ПРАВИЛЬНО менять дизайн, если он был сделан в QT Designer?
Задавал вопрос по объяснению с PyQt5 & Qt Designer.
Ответ был дан, но так же такое замечания:
По этому поводу создаю отдельно эту тему, чтобы спросить следующие:
Правильно ли я создал структуру своей программы? Ведь раньше я всё делал в одном файле, и без функции
__init__иsuper().__init__()Как правильно редактировать интерфейс? Смотрим по примеру из файлов ниже. Мне нужно добавить ещё одну кнопку или же переименовать старую. Разве не правильно и легче зайти в файл ресурсов (fromqt.py) и там например строчку:
self.pushButton.setText(_translate("MainWindow", "PushButton"))
...Просто исправить "PushButton" на нужное нам имя? Или же скопировать старую кнопку и добавить ещё одну. По такому принципу я делал программу до этого.
- Так же есть вариант, раз у нас файл ресурсов это отдельный файл, то просто зайти в
qt designer, предварительно сохранив старую версию в.uiи просто добавить новые изменения, сохранить файл и просто заменить старый файл ресурсов на новый?
Но если учитывать заметку наведенную от автора ответа, получается что это не правильный метод изменения интерфейса.
Просьба помочь разобраться с этим. (Буду очень благодарен за наведенный пример).
Прикрепляю файлы:
main.py:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from fromqt import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
def run():
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
run()
fromqt.py:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(914, 553)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 260, 131, 51))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(270, 170, 111, 41))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(self.label.clear)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.label.setText(_translate("MainWindow", "dsadasddasdasd"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (1 шт):
Правильный вариант, у нас в третьем вопросе.
зайти в
qt designer, сделать изменения в.ui;сконвертировать
.uiвfromqt.py; Обратите внимание на строку вfromqt.py-WARNING! All changes made in this file will be lost!
запускайте
main.pyс новым дизайном.
Но если вдруг вы потеряли файл .ui и у вас сейчас нет времени его нарусовать,
а надо срочно что-то добавит ли изменить, тогда смотрим ниже:
main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from fromqt import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.label.clear)
self.newButton = QtWidgets.QPushButton("Новая кнопка", self.centralwidget)
self.newButton.setGeometry(QtCore.QRect(320, 260, 131, 51))
self.newButton.clicked.connect(self.click_newButton)
def click_newButton(self):
self.label.setText("Hello World")
def run():
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
run()
fromqt.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(914, 553)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 260, 131, 51))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(270, 170, 111, 41))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
# self.pushButton.clicked.connect(self.label.clear)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.label.setText(_translate("MainWindow", "dsadasddasdasd"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
UPDATE
Ещё не большой вопрос, не хочу уже создавать для него отдельную тему. Подскажите пожалуйста, что значит. Он как то влияет на расположения виджетов? Центрирует..? Вы использовали его в строчке, где создавали новую кнопку, а точнее:
class MainWindow(..)
...
self.newButton = QtWidgets.QPushButton("Новая кнопка", self.centralwidget)
Это не не большой вопрос, отдельная тема для большого разговора.
Если коротко:
QPushButton::QPushButton(const QString &text, QWidget *parent = nullptr)
Создает кнопку с родителем `parent`и текстом `text`.
https://doc.qt.io/qt-5/qpushbutton.html#QPushButton-1
виджет без родителя - это окно. Попробуйте пример ниже. Поэтому все что мы хотим показать в главном окне должно иметь родителя основного виджета приложения.
В нашем случае Класс QMainWindow предоставляет главное окно приложения.
QMainWindow - это особый класс.
QMainWindow имеет свой собственный layout, к которому вы можете добавить
QToolBars, QDockWidgets, QMenuBar и QStatusBar.
Макет имеет центральную область, которая может быть занята любым виджетом.
У нас этот 'любой виджет' - это:
self.centralwidget = QtWidgets.QWidget(MainWindow)
MainWindow.setCentralWidget(self.centralwidget)
Qt Main Window Framework читаем здесь https://doc.qt.io/qt-5/qmainwindow.html#qt-main-window-framework
Расположение виджетов - это также отдельная большая тема. В нашем случае мы используем абсолютное позиционирование, которое осущестляется:
self.newButton.setGeometry(QtCore.QRect(320, 260, 131, 51))
этот способ не практичный.
Вам надо изучить классы QBoxLayout, QFormLayout, QGridLayout, ...
для дальнейшего разговора.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from fromqt import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.label.clear)
# self.newButton = QtWidgets.QPushButton("Новая кнопка", self.centralwidget) # ---
self.newButton = QtWidgets.QPushButton("Новая кнопка") # +++
self.newButton.setGeometry(QtCore.QRect(320, 260, 131, 51))
self.newButton.clicked.connect(self.click_newButton)
self.newButton.show() # +++
def click_newButton(self):
self.label.setText("Hello World")
def run():
app = QtWidgets.QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
run()


