2024

Как запустить интерфейс?

После того как мы создали интерфейс в Qt Designer, возникает следующий вопрос: как заставить его работать?

Сам файл .ui - это ещё не программа. Это описание нашего будущего окна: какие элементы в нём находятся, где они расположены, какие у них названия и свойства.

Нам нужен Python-файл, который:

  1. запустит Python внутри Micromine;
  2. найдёт наш файл интерфейса;
  3. загрузит его;
  4. покажет окно пользователю.

И для этого случая у нас есть main_app.py. Именно он будет точкой входа нашего скрипта - файлом, который пользователь будет запускать из Micromine.

Первый запуск

В нашем проекте файл main_app.py находится рядом с интерфейсом:
Для начала нам понадобятся библиотеки PySide6:
from PySide6.QtWidgets import QApplication

from PySide6.QtUiTools import QUiLoader

from PySide6.QtCore import QFile
PySide6 позволяет Python работать с графическим интерфейсом Qt.

Но есть одна проблема.

Если запустить Python через VS Code, он обычно знает, где находится запущенный файл. А Micromine использует собственный внутренний интерпретатор Python, поэтому нам нужно явно указать Python папку, в которой находится наш скрипт.

Для этого используем следующи строки, размещаем их в самом начале main_app.py:
import os

import sys

from pathlib import Path
Затем идут 3 строки для библиотеки Pyside6, и в самом конце:

script_path = Path(os.path.dirname(os.path.realpath(__file__)))

sys.path.insert(0, str(script_path))

Здесь пока не обязательно понимать каждую функцию. Нам важно другое: в переменной script_path мы получаем путь к папке нашего проекта, а затем добавляем эту папку в sys.path.

Другими словами, мы говорим Python, чтобы он искал наши файлы (в том числе main_window.ui) именно там, где мы ему скажем.

Запускаем Qt

Теперь создаём приложение:
app = QApplication.instance()

if app is None:

app = QApplication()

Сначала мы проверяем, существует ли уже объект QApplication. Если его нет - создаём. Это связано с тем, что наш скрипт запускается внутри Micromine, где Qt-приложение уже может существовать.

Загружаем наш интерфейс:

Теперь нужно открыть main_window.ui:
loader = QUiLoader()

ui_file = QFile(str(script_path / "main_window.ui"))

ui_file.open(QFile.ReadOnly)

window = loader.load(ui_file)

ui_file.close()

Данная часть кода позволяет перевести интерфейс в объект, с которым уже сможет работать Python. Например, дальше мы можем написать window.lineEdit и обратиться к конкретному элементу нашего интерфейса. К примеру, обратиться к полю выбора основания склада.

Последние две строки, которые нужно написать – это window.show() и app.exec(), где первая показывает окно, а вторая запускает цикл обработки событий Qt, благодаря которому интерфейс продолжит реагировать на действия пользователя: нажатия кнопок, ввод текста и т.д.

Результат main_app.py должен быть такой:
Диалоговое окно открывается, но не откликается на действия пользователя. В следующих частях научим его отзываться на действия пользователя.