Инструмент Qt Designer в Python — использование на примерах
Инструмент Qt Designer используется для проектирования пользовательских интерфейсов для приложений PyQt в Python.
- Установка инструментов PyQt
- Создание новой виртуальной среды
- Активация виртуальной среды
- Установка PyQt6 и его инструментов
- Запуск Qt Designer
- Создание формы входа
- Настройка свойств виджета
- Добавление виджетов в форму входа
- Преобразование файла .ui в код Python
- Ссылки на дочерние виджеты
- Использование файла .ui напрямую
- Когда следует использовать Qt Designer
Установка инструментов PyQt
На момент написания этого руководства инструменты PyQt6 совместимы с Python 3.9. Поэтому для продолжения руководства вам необходимо установить Python 3.9.
Обратите внимание, что если у вас есть Python 3.10 или выше, вы можете установить Python 3.9 в отдельный каталог и использовать инструменты PyQt6. Например, вы можете установить Python 3.9 в каталог C:\Python39 в Windows.
Создание новой виртуальной среды
Сначала создайте каталог для размещения проектов PyQt6, например, D:\pyqt6
mkdir pyqt6
Затем создайте виртуальную среду с помощью Python 3.9, используя модуль venv:
python -m venv D:\pyqt6\pyqt6-env
Активация виртуальной среды
- Сначала перейдите в каталог виртуальной среды pyqt6-env:
cd D:\pyqt6\pyqt6-env
- Во-вторых, перейдите в папку «Scripts»:
cd Scripts
- В-третьих, активируйте виртуальную среду, выполнив файл activate.bat:
activate
В Windows отобразится следующее:
(pyqt6-env) d:\pyqt6\pyqt6-env\Scripts>
Установка PyQt6 и его инструментов
- Сначала выполните следующую команду для установки пакета pyqt6 в виртуальную среду pyqt6-env:
pip install pyqt6
- Во-вторых, установите пакет pyqt6-tools, содержащий Qt Designer и другие связанные инструменты:
pip install pyqt6-tools
Пакет pyqt-tools установит Qt Designer в следующее место:
D:\pyqt6\pyqt6-env\Lib\site-packages\qt6_applications\Qt\bin\designer.exe
- В-третьих, выполните команду pyuic6(в виртуальной среде pyqt6-env), чтобы проверить версию:
pyuic6 -V
И вы увидите следующий вывод:
6.1.0
Pyuic6 — это инструмент для преобразования файла дизайна(.ui), созданного Qt Designer, в файл Python(.py).
Запуск Qt Designer
В командной строке введите команду designer для запуска Qt Designer:
(pyqt6-env) d:\pyqt6\pyqt6-env\Scripts>designer
Qt Designer будет выглядеть так:
Создание формы входа
Мы создадим простую форму входа с помощью конструктора Qt и загрузим ее в нашу программу Python.
Сначала выберите Файл > Создать или нажмите сочетание клавиш Ctrl-N, чтобы открыть диалоговое окно «New Form»:
Во-вторых, выберите Widget из шаблонов\форм и нажмите кнопку Create:
Он создаст QWidget следующим образом:
Вы можете настроить макет виджета и перетаскивать виджеты из поля виджетов в форму.
Настройка свойств виджета
В редакторе свойств вы можете задать имя виджета, например login_form.
и заголовок окна:
Добавление виджетов в форму входа
- Сначала добавьте на форму виджеты QLabel, QLineEdit и QPushButton:
В следующей таблице перечислены поля, их типы и названия:
Поле | Виджет | Имя объекта |
---|---|---|
Login Window | QWidget | login_form |
Email Address | QLineEdit | email_line_edit |
Password | QLineEdit | password_line_edit |
Login Button | QPushButton | btn_login |
- Во-вторых, установите режим эха для поля пароля на «Password»:
- В-третьих, щелкните правой кнопкой мыши по виджету и установите для него макет «Form Layout»:
Форма изменится на следующую:
- В-четвертых, измените размер кнопки «Login», установив для нее политику горизонтального размера значение «Fixed»:
- В-пятых, сохраните форму в каталоге D:\pyqt6 как файл login_form.ui.
- В-шестых, выберите меню Форма > Предварительный просмотр… или нажмите сочетание клавиш Ctrl-R, чтобы просмотреть форму:
- Наконец, закройте Qt Designer.
Существует два способа использования login_form.ui из программы Python:
- Преобразуйте файл .ui в код Python и используйте сгенерированный код из программы.
- Непосредственно используйте файл .ui в программе.
Преобразование файла .ui в код Python
Сначала выполните следующую команду, чтобы преобразовать файл login_form.ui в файл login_form.py:
pyuic6 -o login_form.py login_form.ui
Обратите внимание, что вам необходимо запустить pyuic6 из виртуальной среды pyqt6-env.
Pyuic6 сгенерировал login_form.py из файла login_form.ui. Login_form.py содержит следующий сгенерированный код Python:
# Form implementation generated from reading ui file 'login_form.ui' # # Created by: PyQt6 UI code generator 6.1.0 # # WARNING: Any manual changes made to this file will be lost when pyuic6 is # run again. Do not edit this file unless you know what you are doing. from PyQt6 import QtCore, QtGui, QtWidgets class Ui_login_form(object): def setupUi(self, login_form): login_form.setObjectName("login_form") login_form.resize(269, 108) self.formLayout = QtWidgets.QFormLayout(login_form) self.formLayout.setObjectName("formLayout") self.label = QtWidgets.QLabel(login_form) self.label.setObjectName("label") self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label) self.email_line_edit = QtWidgets.QLineEdit(login_form) self.email_line_edit.setObjectName("email_line_edit") self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.email_line_edit) self.label_2 = QtWidgets.QLabel(login_form) self.label_2.setObjectName("label_2") self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_2) self.password_line_edit = QtWidgets.QLineEdit(login_form) self.password_line_edit.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.password_line_edit.setObjectName("password_line_edit") self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.password_line_edit) self.btn_login = QtWidgets.QPushButton(login_form) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btn_login.sizePolicy().hasHeightForWidth()) self.btn_login.setSizePolicy(sizePolicy) self.btn_login.setObjectName("btn_login") self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.btn_login) self.retranslateUi(login_form) QtCore.QMetaObject.connectSlotsByName(login_form) def retranslateUi(self, login_form): _translate = QtCore.QCoreApplication.translate login_form.setWindowTitle(_translate("login_form", "Login")) self.label.setText(_translate("login_form", "Email Address")) self.label_2.setText(_translate("login_form", "Password")) self.btn_login.setText(_translate("login_form", "Login"))
Важно отметить, что вам никогда не следует вручную изменять файл login_form.py. Поскольку все ваши ручные настройки будут потеряны, если вы отредактируете login_form.ui в Qt Designer и снова сгенерируете login_form.py.
Во-вторых, создайте файл login.py и импортируйте файл login_ui.py:
import sys from PyQt6.QtWidgets import QApplication, QWidget from login_form import Ui_login_form class Login(QWidget): def __init__(self): super().__init__() # use the Ui_login_form self.ui = Ui_login_form() self.ui.setupUi(self) # show the login window self.show() if __name__ == '__main__': app = QApplication(sys.argv) login_window = Login() sys.exit(app.exec())
Как это работает.
- Импортируйте класс Ui_login_form из файла login_form.py
- Создайте новый экземпляр Ui_login_form и вызовите метод setupUi() для настройки пользовательских интерфейсов.
В-третьих, выполните файл login.py:
python login.py
Появится окно входа в систему:
Ссылки на дочерние виджеты
Чтобы использовать дочерние виджеты виджета Ui_login_form, вы ссылаетесь на их имена с помощью переменной self.ui.
Например, вы можете добавить простую аутентификацию, когда пользователь вводит адрес электронной почты и пароль и нажимает кнопку «Войти» следующим образом:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QMessageBox from login_form import Ui_login_form class Login(QWidget): def __init__(self): super().__init__() # use the Ui_login_form self.ui = Ui_login_form() self.ui.setupUi(self) # authenticate when the login button is clicked self.ui.btn_login.clicked.connect(self.authenticate) # show the login window self.show() def authenticate(self): email = self.ui.email_line_edit.text() password = self.ui.password_line_edit.text() if email == '[email protected]' and password == '123456': QMessageBox.information(self, 'Success',"You're logged in!") else: QMessageBox.critical(self, 'Error',"Invalid email or password.") if __name__ == '__main__': app = QApplication(sys.argv) login_window = Login() sys.exit(app.exec())
Как это работает.
- Сначала подключите сигнал нажатия кнопки к методу аутентификации. Обратите внимание, что мы ссылаемся на кнопку btn_login через переменную self.ui:
self.ui.btn_login.clicked.connect(self.authenticate)
- Во-вторых, определите метод authenticate(), который получает значения из email_line_edit и password_line_edit, и выполните простую проверку этих значений на соответствие жестко запрограммированным значениям:
def authenticate(self): email = self.ui.email_line_edit.text() password = self.ui.password_line_edit.text() if email == '[email protected]' and password == '123456': QMessageBox.information(self, 'Success',"You're logged in!") else: QMessageBox.critical(self, 'Error',"Invalid email or password.")
Уведомление о безопасности: никогда не делайте этого в реальных приложениях.
Помимо создания экземпляра Ui_login_form внутри окна входа, вы можете наследовать окно Ui_login_form, используя множественное наследование, и напрямую ссылаться на дочерние виджеты следующим образом:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QMessageBox from login_form import Ui_login_form class Login(QWidget,Ui_login_form): def __init__(self): super().__init__() # setup the UI self.setupUi(self) # authenticate when the login button is clicked self.btn_login.clicked.connect(self.authenticate) # show the login window self.show() def authenticate(self): email = self.email_line_edit.text() password = self.password_line_edit.text() if email == '[email protected]' and password == '123456': QMessageBox.information(self, 'Success',"You're logged in!") else: QMessageBox.critical(self, 'Error',"Invalid email or password.") if __name__ == '__main__': app = QApplication(sys.argv) login_window = Login() sys.exit(app.exec())
Использование файла .ui напрямую
Другой способ использования дизайна, созданного Qt Designer, — это загрузка файла .ui напрямую с помощью функции loadUi() модуля uic:
from PyQt6.QtWidgets import QApplication, QWidget, QMessageBox from PyQt6 import uic import sys class Login(QWidget): def __init__(self): super().__init__() self.ui = uic.loadUi('login_form.ui', self) # authenticate when the login button is clicked self.ui.btn_login.clicked.connect(self.authenticate) self.show() def authenticate(self): email = self.email_line_edit.text() password = self.password_line_edit.text() if email == '[email protected]' and password == '123456': QMessageBox.information(self, 'Success',"You're logged in!") else: QMessageBox.critical(self, 'Error',"Invalid email or password.") if __name__ == '__main__': app = QApplication(sys.argv) login_window = Login() sys.exit(app.exec())
Функция loadUi() возвращает экземпляр QWidget, и вы можете ссылаться на дочерние виджеты через переменную self.ui.
Когда следует использовать Qt Designer
Файл .ui, созданный дизайнером Qt, создает уровень абстракции между доступным виджетом и кодом, который его использует. Поэтому, если вы начинаете с PyQt, вам следует кодировать UI вручную, а не использовать Qt Designer. Делая это, вы точно знаете, какие виджеты доступны в приложении.
Однако если вы знакомы с PyQt и работаете над большим приложением, вам следует использовать Qt Designer для создания хорошего дизайна и повышения производительности.