Skip to main content

QT6

Установка: 

pip install pyqt6
pip install pyqt6-tools

Минимальное приложение: 

from PyQt6.QtWidgets import QApplication, QWidget
import sys

app = QApplication(sys.argv)
window = QWidget()
window.show()
sys.exit(app.exec())

В составе QT много модулей, 

Модуль Назначение
QtGui

Классы для интеграции с оконной системой, обработки событий, 2D-графики, базовых изображений, шрифтов, иконок и текста. 

 

QIcon класс работы с иконками

Типы окон

QMainWindow Главное окно приложения и связанные с ним классы для управления главным окном. 

from PyQt6.QtWidgets import QApplication, QMainWindow
import sys

app = QApplication(sys.argv)
window = QMainWindow()
window.statusBar().showMessage("Welcome to pyqt6 coding")
window.show()
sys.exit(app.exec())

QMainWindow имеет свой собственный макет, содержащий QToolBars, QDockWidgets, QMenuBar и QStatusBar.

QDialog Базовый класс окна верхнего уровня, используемое для краткосрочных задач и краткого общения с пользователем. 
QDialogs может быть модальным или немодальным.

QWidget Базовый класс всех объектов пользовательского интерфейса, получает мышь, клавиатуру и другие события
из оконной системы и отображает свое изображение на экране.

Объектно-ориентированный подход настройки окна

Создаем класс Window, настраиваем свойства и 

from PyQt6.QtWidgets import QApplication, QWidget 
from PyQt6.QtGui import QIcon 
import sys 
 
class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        self.setWindowIcon(QIcon('pyqt6lessons\images\python.png')) 
        self.setStyleSheet('background-color:green') 
        self.setWindowOpacity(0.5) 
 
app = QApplication(sys.argv) 
window = Window() 
window.show() 
sys.exit(app.exec()) 

Управление событиями

Сигналы — уведомления, отправляемые виджетами, когда что-то происходит. Это может быть нажатие кнопки, изменение текста в поле ввода, изменение текста в окне, ... Многие сигналы инициируются в ответ на действия пользователя, но не только: в сигналах могут отправляться данные с дополнительным контекстом произошедшего.

Слоты — приёмники сигналов. Слотом можно сделать любую функцию (или метод), просто подключив к нему сигнал. Принимающая функция получает данные, отправляемые ей в сигнале. У многих виджетов Qt есть встроенные слоты, эти виджеты можно подключать друг к другу напрямую.

class Window(QWidget): 
    def __init__(self): 
        super().__init__() 
        self.setGeometry(200,200, 700, 400) 
        self.setWindowTitle("Python GUI Development") 
        self.create_button()

    def create_button(self):
        btn = QPushButton("Click", self)
        btn.clicked.connect(self.the_button_was_clicked)

    def the_button_was_clicked(self):
        print("Clicked")

Соединение сигнала и слота происходит в функции btn.clicked.connect(self.the_button_was_clicked) Похоже,Таблицы событий:

Мышь:

ТипОписание
MouseButtonPressНажата кнопка мыши
MouseButtonReleaseОтпущена кнопка мыши
MouseButtonDblClickДвойной клик
MouseMoveДвижение мыши
WheelКолёсико мыши
EnterКурсор вошёл в виджет
LeaveКурсор покинул виджет
HoverEnterHover вошёл
HoverMoveHover движение
HoverLeaveHover вышел

Клавиатура:

ТипОписание
KeyPressНажата клавиша
KeyReleaseОтпущена клавиша
ShortcutСработал shortcut
ShortcutOverrideПопытка перехвата shortcut
InputMethodIME ввод
InputMethodQueryЗапрос IME

Фокус и активация

ТипОписание
FocusInПолучен фокус
FocusOutПотерян фокус
ActivationChangeИзменение активности окна

Окна и виджеты

ТипОписание
ShowВиджет показан
HideВиджет скрыт
CloseЗакрытие
ResizeИзменение размера
MoveПеремещение
PaintПерерисовка
LayoutRequestЗапрос layout
UpdateRequestЗапрос обновления
PolishФинальная инициализация
PolishRequestЗапрос polish
ParentChangeИзменился родитель
ParentAboutToChangeРодитель изменится
WindowStateChangeИзменение состояния окна
WindowActivateОкно активировано
WindowDeactivateОкно деактивировано
WindowTitleChangeЗаголовок окна
WindowIconChangeИконка окна
WindowBlockedОкно заблокировано
WindowUnblockedОкно разблокировано

Геометрия и экран

ТипОписание
ScreenChangeInternalИзменился экран
ScreenChangeInternalDPI/Screen изменился
OrientationChangeСмена ориентации
DevicePixelRatioChangeИзменение DPR

Drag & Drop

ТипОписание
DragEnterDrag вошёл
DragMoveDrag перемещение
DragLeaveDrag покинул
DropDrop

Буфер обмена

ТипОписание
ClipboardИзменился буфер обмена

Таймеры

ТипОписание
TimerСработал таймер
ZeroTimerEventТаймер с нулевой задержкой

Touch / Tablet / Gesture

ТипОписание
TouchBeginTouch начало
TouchUpdateTouch обновление
TouchEndTouch конец
TabletPressПеро нажато
TabletMoveПеро движение
TabletReleaseПеро отпущено
GestureЖест
GestureOverrideПерехват жеста

Состояние

ТипОписание
EnabledChangeИзменение enabled
FontChangeИзменение шрифта
StyleChangeИзменение стиля
PaletteChangeИзменение палитры
LanguageChangeСмена языка
LocaleChangeСмена локали
ThemeChangeСмена темы
ApplicationStateChangeСостояние приложения

Продвинутые опции

должнобытьгораздо
ТипОписание
DynamicPropertyChangeИзменение свойства
ChildAddedДобавлен ребёнок
ChildRemovedУдалён ребёнок
ChildPolishedРебёнок отполирован
MetaCallВызов meta-object
ThreadChangeСмена потока
DeferredDeleteОтложенное удаление
QuitЗавершение приложения
PlatformSurfaceИзменение поверхности
PlatformPanelPlatform panel
UserНачало пользовательских событий
больше

Пользовательские одного.события

ТипОписание
UserБазовый пользовательский event
MaxUserМаксимальный ID

 

event = QEvent(QEvent.Type.User)
QCoreApplication.postEvent(obj, event)

Поиск событий:

def event(self, event):
    print(event.type())
    return super().event(event)

#или
widget.installEventFilter(self)

def eventFilter(self, obj, event):
    print(obj, event.type())
    return False