Qt как сделать окно без рамки

Обновлено: 01.05.2024

В разделе «Система Windows» Windows Widget Widget использует стиль окна операционной системы, многие боссы не любят строки заголовка и системные кнопки этого окна, и программист не может изменить панель заголовка окна и большую болью. Есть много случаев в Интернете, чтобы использовать Qt для реализации безрамоглазного окна, но он доступен без полного случая.

Сегодня с управлением вытягиванием пользовательского интерфейса реализована рамка для пользовательских окон, и она все еще стабильна. Поделитесь, чтобы научиться учиться на новичках.

I. Трудности достигают с безграничным окном

1, мышь перетаскивает строку заголовка и движутся окно сопротивления.

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

II. Технические моменты, реализуемые безграничном окном

1, установите безграничную коробку

2, позвоните по живописному перерезанию границы окна

3. Захватите событие перетаскивания мыши в строке заголовка, чтобы переместить окно сопротивления.

4, фильтрация мыши мыши, перемещайте, событие выпуска, перетащите границу окна, измените размер окна.

3. Рабочий интерфейс Пример диаграммы


IV. Состав интерфейса работы

Конструкция конструкции границы заключается в следующем:


Согласно содержимому на рисунке, легко выложить через макет GridLayout в UI, а содержимое окна - это макет.

В этом примере я использовал 8 ярлык, который будет использоваться в качестве окна окна, четыре из которых в качестве границы верхнего и нижнего, четыре в виде рамки из четырех углов. Используйте виджет в качестве рамки для окна. Всего 9 элементов образуют общий кадр окна, в соответствии с девятью форматом макета дворца, макетом с Gridlayout.

Верхняя и нижняя этикетка границы устанавливает фиксированную высоту 5PIX, а левая и правая метка границы устанавливает фиксированную ширину 5PIX. Четыре угла устанавливаются для фиксации высотой 5 пикселей, шириной 5 пикселей. Виджет окна содержимого автоматически растягивается в соответствии с макетом.

Определенно кто-то спрашивает, зачем использовать метку как границу, объяснить это,

(1) Сохранить ресурсы: когда окно, вы должны захватить положение мыши. Если все окно открывает дорожку мыши, когда мышь на окне, если вы хотите растянуть окно, система захватает позицию мыши, потребляйте слишком много ресурсов. Если вы используете метку как границу, вам нужно только включить отслеживание мыши на девяти этикетке. Только мышь находятся на этих 9 этикетке, и система начала захватывать положение мыши, сохраняя ресурсы CPU.

(2) Поскольку этикетка можно использовать для отображения изображений, если вы не хотите рисовать границу, на этикетке вы можете сделать красивую границу, например округлую границу, или окно с тенью.

(3) Конечно, вы можете сделать эту функцию без метки, что не содержимое, обсуждаемое здесь.

V. Дизайн макета окна

1. Откройте QT Creator, создайте проект приложений виджета, выберите тип пользовательского интерфейса, тип окна является QMainWindow или QDialog. Название проекта является MainWindow, конечно, проект похож на тебя.

2, откройте MainWindow UI, отредактируйте.

3, Удалите меню MainWindow, панель инструментов, панель состояния (необходимо, чтобы сохранить строку состояния по мере необходимости)

4, перетащите в первую строку из трех меток, помещенных в окно пользовательского интерфейса, названное: FLEHTPOLLALLABLABEL, TOPLabel, Rightoplabel, представляют левую угловую границу, верхнюю границу, верхнюю правую угловую границу, очистить текст на метке.

5, перетащил в ярлык виджета (кадр также Line) и метку с именем: flowlabel, mainwidger, rightlabel. Представляет левую границу, основную рамку, правильную коробку, очистить текст на метке.

6. Перетащите три этикетки, поставьте его в третью строку, названную: левый, правый, правый знак, представляют левую угловую границу, нижнюю границу и нижнюю правую угловую границу. Очистить текст на Лаве.

7. Щелкните правой кнопкой мыши на пространстве MainWindow Space of UI, выберите макет в меню, выберите макет сетки, и 9 элементов среднего размера распределения.

8. Выберите 9 ярлык в баре свойств, включите след мыши.

9, выберите верхнюю и нижнюю этикетку в нижней части, в строке атрибута, установите максимальную, минимальную высоту 5, выберите стиль мыши, чтобы переместить стиль мыши вверх и вниз.

10, выберите левую и правую метку, в строке атрибута, установите максимальную минимальную ширину 5 и выберите стиль мыши стиль мыши, чтобы переместить вокруг.

11, выберите верхний левый, нижнюю правую метку, в строке атрибута, установите максимум, минимальная ширина 5, максимальная минимальная высота составляет 5, установите стиль мыши, чтобы переместить стиль мыши в верхнем левом углу.

12, выберите верхнюю направую левую левую метку, в строке атрибута, установите максимум, минимальная ширина 5, максимальная минимальная высота составляет 5, установите стиль мыши, чтобы переместить стиль мыши в верхнем правом нижнем углу.

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

13, редактируйте MainWindow.cpp, в конструкторе добавьте следующий код:

14. Запустите программу, появляется безграничное окно, цвет фона является серым белым по умолчанию, установите прозрачность, а прозрачный эффект окна может быть установлен. Поместите мышь слева и правые стороны окна, см. Если стиль мыши оставлен и справа, стиль мыши верхних и нижних ходов, четыре угла, будь то наклон, наклонные стили мыши.

15. Переоборудование Paintevent, нарисуйте границу для окна без границы, установите цвет фона в окно.

Запустите программу, выходит новое окно.

6. Перетащите границу окна, измените реализацию размера окна.

1. В функции конфигурации MainWindow из MainWindow.cpp, добавьте фильтры событий на ярлык границы выше.

2. В файле заголовка MainWindow.h определите параметры MWP, M_Bпрессируемого, мышевика и Plast.

(1) Определите тип перечисления, чтобы определить, какая граница перетаскивается, какой угол перетаскивается. По умолчанию неизвестен. Переменная в системе называется MWP.

(2) Определите логическое значение M_Bпрессируемое. Когда мышь нажата на метку по границе, установите значение FLAT TRUE, если есть выпущенная мышь, False

(3) Определите местоположение местоположения, после каждого перетаскивания, сохраните точку координат после перетаскивания, а затем снова запускайте перетаскивание, разница в новом месте и переменной - это количество Windows должно увеличиваться или уменьшаться.

3. Воспользуйтесь перетаскиванием и переписать фильтр событий.

(1) Когда фильтр срабатывает, мы должны сначала определить тип события. В настоящее время мы заинтересованы в насущных событиях, мобильных мероприятиях мыши, события выпуска мыши, за исключением этих трех событий, других событий, других событий. в родительский класс. Итак, мы отфильтровали три события.

(2) Во-первых, если мы отфильтровали его к прессованному событию мыши, мы должны сначала обнаружить, какая граница мыши нажимает, если это не метка по границе, это не то, что мы хотим. Вот функциональный файл TestLaborder, обнаруженный, если целью события является одной из 8 пограничной этикетки, затем возвращает значение перечисления границы, в противном случае возвращается неизвестно. Если это граница, установите M_BPRESED в True, в противном случае установите false. Мероприятие мыши больше не занимается.

(3) обработка событий выпуска мыши. Если мышь отпускается, флаг настройки M_Bпрессирован, а событие не должно быть обработано.

(4) Мобильная фильтрация мыши.

Перетаскивание границы Рассчитайте идею дизайна смещения движения мыши:

Когда событие движения мыши срабатывает, позиция PTMP мыши вычтена с последним сохраненным положении Plast, рассчитывает смещение каждого движения мыши.

TestLabelborder обнаруживает функцию границы следующим образом:

(4) Через фильтр мыши мы рассчитываем смещение мыши и перемещение мыши на одном кадре, то мы можем перетащить размер окна.

Функции обработки перетаскивания следующие:

Запустите программу еще раз, поставьте мышь на четыре стороны нового окна на четырех углах, перетащите окно и измените размер окна. Полная программа, которая может быть затаплена и изменением окна, завершена.

7. Изготовление драйвенного заголовка строки и максимизации системных кнопок

Перед безграничным окном, который можно перетащить, чтобы изменить размер, нет никакой строки заголовка, в соответствии с моей идеей, потому что мы используем фильтр события, вы также можете отфильтровать событие мыши заголовка строки, чтобы перетащить заголовок окна, Реализуйте мобильное местоположение окна функционально. Учитывая, что код фильтра событий не слишком велик, и мы помещаем строку заголовка в качестве компонента в упаковке.

1. Создайте название функциональную панель UI

(1) Вновь построенный класс пользовательского интерфейса, названный TellFrame, родительский класс является виджетом, конечно, кадр также может быть выбран.

(2) Направление уровня, перетащите метку, установите фиксированный размер 35, логотип в качестве строки заголовка, очистить текст, добавьте изображения значка, как изображение логотипа, названная logoLabel.

(3) Направление уровня, перетащите метку, установите текст на «заголовок окна», установите минимальное значение высоты 35.

(4) Уровень 3 pushbutton, названный: pb_close, pb_mid_max, pb_mix, соответственно, закрыт, максимальное восстановление, минимизация кнопки. Установите фиксированный размер 35, дайте три кнопки, чтобы установить изображение значка. В моем примере добавлен 6 pushbutton, используемый для представления личной информации, настройки, кнопок справки, вы можете добавить функциональную кнопку по мере необходимости.

(5) Пробелы окна правильного ключевого интерфейса, выберите макет - «Горизонтальный макет». Строка заголовка сделана.

2, добавьте системную кнопку в строку заголовка, чтобы добавить событие

(1) Щелкните правой кнопкой мыши максимизировать, минимизировать, восстановить кнопки, добавьте слоту щелчка.

(2) Определите сигнал для обработки сигнала кнопки функции к главному окну MainWindow. В зависимости от проектных идей, максимизация минимизации должна быть реализована главным окном.

(3) Осознайте максимизацию функции канавки кнопки.

(4) В главном окне в главном окне функция окна сводит к минимуму минимизации. В конструкторе MainWindow слоты и сигналы ссылок.

(5) Минимизация, максимизация и восстановление функции док-станции в главном окне.

(6) Поместите кадр заголовка бар в главном окне.

Откройте UI MainWindow для редактирования, в Mainwidget, названное tealframe, чтобы перетащить виджет, обновить до заголовка. Переместить в верхнюю часть mainwidget, измените фиксированную высоту 56 заголовка Creatframe.

(7) Запустите программу, нажмите «Максимизировать», минимизировать кнопки «Recovery» и реализуйте максимальную функциональность окна окна.

3, внедрить название окна сопротивления, перетащите движение окна

Перетащите окно Header Window Mobile, используйте другой метод фильтра событий с главным окном, этот пример реализован с использованием перезаписываемого события мыши.

(1) При захвате события, нажатого мышью, сначала определите, является ли это титрелаб, если оно обрабатывается, в противном случае он передан в обработку родительской классы, а мероприятие Pream Mouse реализуется в заголовке заголовка .CPP. код. Принцип кода точно такой же, как обработка окна сопротивления, описанного выше.

(2) Когда событие захвачено, код обработки и размер окна изменения полностью согласуются.

(3) Когда движение мыши будет захвачено, высмещение движения мыши рассчитывается, сигнал отправляется, а главное окно передается к главному окну для обработки движения окна.

(4) Главное окно, обрабатывая окно, перемещая код

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

(6) Управляйте программой, перетащите строку заголовка, можете перемещать любое окно.

Восемь. Программа завершает код.

Кодекс всего пользовательского окна завершено. Напишите документ на протяжении всего дня, очень усталый. Если вы думаете, что эта статья поможет вам помочь вам, сканируйте QR-код ниже, награда на вознаграждение WECHAT. Один кусок не слишком маленький, а 100 штук не слишком много.


Этот ресурс проекта можно скачать, скачать адрес:QT внедрение пользовательских оконных кадров

Интеллектуальная рекомендация

Android Gausso нечеткий реализация

1, используйте скольжение Применимый сценарий: динамическая конфигурация фона изображения 2, на картину Гаусс, вам нужно передавать картинки на битовые объекты Не рекомендую: Используйте растровое изо.


Установите Spark 2.2.1 под облачным сервером Alibaba centos7.2

Выбор версии при установке Spark связан с версией hadoop. Нажмите, чтобы открыть ссылкуПосле ввода выберите подходящее изображение. При нормальных обстоятельствах можно использовать оба .

Заставьте FireFox fieldset имитировать IE в закругленных углах

Метка набора полей написана в Firefox, углы не закруглены, как в IE, что влияет на внешний вид. Мы можем установить стиль в fieldset: .

Установка MongoDB и базовый синтаксис

Метод вызова Notepad ++ и GVIM в Vivado

Метод вызова Notepad ++ и GVIM в Vivado Позвоните Notepad ++ Позвоните в метод GVIM, это не на этом, потому что в середине программных файлов есть пространство Правильный способ установки его на диск .

Если по какой-то причине, вы решили отказаться от стандартного системного обрамления окна и реализовать все Title Bar`ы окна самостоятельно в QML, то вы вполне можете реализовать это средствами QML, что будет даже проще чем в C++, на мой взгляд. Для ознакомления можете посмотреть статью по кастомизации окна приложения в стиле AIMP . Там имеется значительная доля кода по реализации механики перемещания окна, а также его ресайза. Преимущество QML в данном случае состоит в том, что QML сразу обеспечивает верстку приложения, а значит можно с помощью MouseArea и якорей сразу определить нужную обработку при клике и перемещении мыши без каких-либо специальных расчётов положения курсора в области окна.

А механика расчёта изменения размеров и положения будет сходна с той, которая была применена в статье по кастомизации приложения в C++. То есть необходимо будет запомнить положение, где была нажата кнопка мыши, а потом уже относительно этого положения делать ресайз и перемещение окна приложения, пока кнопка не будет отпущена.


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

Если Вам понадобится специальный Title Bar, то он также может отвечать за перемещение окна приложения. То есть необязательно делать всю центральную область чувствительной к перемещению.

main.qml

Приложение создаётся по умолчанию и изменять будет только файл main.qml, который я и приведу в качестве примера.

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

На этом шаге мы перечислим значения, определяющие тип окна .

При использовании класса QWidget окно по умолчанию создается с заголовком, в котором расположены значок, при нажатии на который выводится оконное меню, текст заголовка и кнопки Свернуть , Развернуть и Закрыть . Указать другой тип создаваемого окна позволяет метод setWindowFiags() или параметр flags в конструкторе класса QWidget . Обратите внимание, что метод setWindowFiags() должен вызываться перед отображением окна. Формат метода:

  • Widget - тип по умолчанию для класса QWidget ;
  • Window - указывает, что компонент является окном, независимо от того, имеет он родителя или нет. Окно выводится с рамкой и заголовком, в котором расположены кнопки Свернуть , Развернуть и Закрыть . По умолчанию размеры окна можно изменять с помощью мыши;
  • Dialog - диалоговое окно. Выводится с рамкой и заголовком, в котором расположены кнопки Справка и Закрыть . Размеры окна можно изменять с помощью мыши. Это значение по умолчанию для класса QDialog . Пример указания типа для диалогового окна: window.setWindowFlags(QtCore.Qt.Dialog) ;
  • Sheet и Drawer - окна в стиле Apple Macintosh ;
  • Popup - указывает, что окно представляет собой всплывающее меню. Оно выводится без рамки и заголовка и, кроме того, может отбрасывать тень. Изменить размеры окна с помощью мыши нельзя;
  • Tool - сообщает, что окно представляет собой панель инструментов. Оно выводится с рамкой и заголовком (меньшем по высоте, чем обычное окно), в котором расположена кнопка Закрыть . Размеры окна можно изменять с помощью мыши;
  • ToolTip - указывает, что окно представляет собой всплывающую подсказку. Оно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя;
  • splashScreen - сообщает, что окно представляет собой заставку. Оно выводится без рамки и заголовка. Изменить размеры окна с помощью мыши нельзя. Это значение по умолчанию для класса QSplashScreen ;
  • Desktop - указывает, что окно представляет собой рабочий стол. Оно вообще не отображается на экране;
  • SubWindow - сообщает, что окно представляет собой дочерний компонент, независимоот того, имеет он родителя или нет. Выводится оно с рамкой и заголовком (меньшим по высоте, чем у обычного окна), но без кнопок. Изменить размеры окна с помощью мыши нельзя;
  • ForeignWindow - указывает, что окно создано другим процессом;
  • CoverWindow - окно, представляющее минимизированное приложение на некоторых мобильных платформах.

Определить тип окна из программы позволяет метод windowType() .

    MSWindowsFixedSizeDialogHint - запрещает изменение размеров окна. Кнопка Развернуть в заголовке окна становится неактивной;

Получить все установленные флаги из программы позволяет метод windowFlags() .

Я: setFixedSize(size()); чтобы остановить изменение размера окна, но стрелки изменения размера по-прежнему появляются, когда мышь находится над границей окна.

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

попробуйте что-то вроде этого:

Если это не работает, все, что вам нужно сделать, это определить, какой виджет активируется QSizeGrip. Вы можете сделать это, установив фильтр событий в своем приложении и попытавшись поймать mouseMoveEvent QSizeGrip. Затем отладьте Родительский виджет.

вот пример функции eventFilter, которую вы можете использовать:

вы, вероятно, могли бы поймать его шоу, а также, это зависит от вас.

Qt имеет windowFlag под названием Qt::MSWindowsFixedSizeDialogHint для этого. В зависимости от того, что именно вы хотите, вы хотите объединить этот флаг с Qt::Widget , Qt::Window или Qt::Dialog .

один-лайнер, если вы точно знаете, какой размер окна должен быть:

при использовании Qt Designer установите свойства "sizePolicy" вашего окна в "фиксированный" в вертикальном и горизонтальном направлениях и установите минимальные и максимальные размеры равными значениями. Затем щелкните правой кнопкой мыши на окне и выберите "удалить строку состояния", чтобы избавиться от "захвата размера" в правом нижнем углу. Или удалите только размер захвата с помощью предложения от Фрэнсиса (а не всю строку состояния).

Я обнаружил, что вызов setSizeConstraint (QLayout::SetFixedSize) на макете работал лучше всего для меня. В частности, из конструктора QMainWindow я вызвал:

(Я использую Qt 4.8.)

поскольку это был также простой способ решить вопрос OP, я подумал, что поделюсь им для других. Похоже, что их много. способы достижения этого в Qt, но не все могут быть идеальными для каждой ситуации. Я попробовал несколько других вариантов, размещенных здесь, но у них были различные проблемы или трудности, что меня не устраивает в моей собственной ситуации.

Обратите внимание, что здесь можно выбрать базовый класс QWidget.

  1. Имя класса: Виджет
  2. Базовый класс: QWidget
  3. Заголовочный файл: widget.h
  4. Исходный файл: widget.h
  5. Создать интерфейс
  6. Файл интерфейса: widget.ui
  7. pro файл: firstLessonReview
  8. Основная функция: main.cpp

main.cpp


  1. Строка 6 создает объект QApplication для управления приложением и получает два параметра командной строки.
  2. Строка 7 создает объект Widget, окно виджета, которое появляется, когда объект фактически запущен.
  3. Строка 8 позволяет отображать объект виджета, поскольку qt по умолчанию использует новые визуальные виджеты, которые не отображаются
  4. Строка 10, пусть объект QApplication запустится и войдет в режим опроса событий, чтобы он мог реагировать, когда событие происходит.

Установить окно без полей

  1. Запустите программу и наблюдайте за результатами следующим образом


2. Введите widget.cpp Файл, добавить this->setWindowFlags(Qt::FramelessWindowHint);

2,1 дюйма setWindowFlags Щелкните правой кнопкой мыши и выберите «Следовать символу» под курсором.

2.2. Наблюдение: эта функция имеет только один параметр, продолжайте щелкать правой кнопкой мыши в Qt :: WindowFlags


2.3 Затем продолжайте следовать WindowType

2.4. Обратите внимание, что WindowType - это переменная перечисления, выберите из нее. FramelessWindowHint , Написать setWindowFlags() Функция

3. Запустите программу, результаты будут следующими.

Перетащите и отпустите

Обычно для перетаскивания программы мы щелкаем левой кнопкой мыши и удерживаем верхнюю боковую панель окна для перетаскивания.Здесь мы реализуем функцию удерживания левой кнопки и перетаскивания в любое место окна.

  1. Математическая связь y = x + z

    Белый фон - это рабочий стол, черный прямоугольник - это окно программы, стрелка - позиция, в которой нажата левая кнопка мыши, y - позиция левого верхнего угла рабочего стола для левой кнопки мыши, а x - верхний левый угол окна. Положение левого верхнего угла рабочего стола, z - это положение левой кнопки мыши по отношению к верхнему левому углу окна. Существует векторная связь y = x + z или в прямоугольной системе координат. Координата y также является суммой координаты x и координаты z.
  2. Действиями мыши являются нажатие, перемещение (т. Е. Перетаскивание и перемещение) и отпускание. Для qt это все события, и они являются событиями под виджетом. Поиск по индексу меню справки Взаимодействие с другими людьми mousepress

    2.1. Дважды щелкните mousePressEvent , Выберите во всплывающем окне QWidget Class | Qt Widgets 5.12


    2.2 Поднимитесь вверх и обратите внимание, что это QWidget Class , Открыть Protected Functions , Находим в нем нужную нам функцию


    2.3. Скопируйте их в widget.h, сделайте объявление функции и в widget.cpp Бетонная реализация


    2.4 Поскольку нам нужно работать с точками, widget.h Включить файлы заголовков QPoint , И из-за операции события мыши (события мыши), поэтому в widget.h Содержит QMouseEvent
    2.4.1 y получение позиции
    y - позиция (позиция) точки относительно рабочего стола (глобальная), когда происходит событие нажатия мыши. Итак, это должно быть положение mouseEvent
    QPoint y = event->globalPos();
    2.4.2 x определение местоположения
    x - позиция всего окна виджета (this) относительно рабочего стола (глобально)
    QPoint x = this->geometry().topLeft();
    2.4.3 положение по оси Z
    Приложение y = x + z; QPoint z = y -x;

    2.5. Когда положение x, y, z получено, переместите окно (переместите геометрию)
    При перемещении окна y - значение переменной, x - прямое, z - фиксированное значение (полученное в mousePressEvent, необходимо использовать в mouseMoveEvent, поэтому измените z на частную переменную класса
    2.5.1. Определение частных переменных z в widget.h z

    2.5.2 Используйте частный z в widget.cpp

    2.5.3 Реализуйте x, y, z в функции mouseMoveEvent
    Значение y изменяется со временем, и его необходимо постоянно читать, z - фиксированное значение, x - значение переменной, x = y-z;

    2.5.4 Перемещение окна
    Перемещение (перемещение) - это окно (т. е. виджет), и положение перемещения может быть определено с помощью x, то есть движение окна следует за движением мыши (после системы, вводится движение мыши x , Выводится движение окна Y, что логично, но обратное неверно)
    this->move(x);

    2.6 Версия для мыши
    Просто удалите значение z напрямую, просто вызовите QPoint

    2.7 Запустите программу, нажмите левую кнопку мыши, чтобы переместить окно

Сводное отражение движения окна

  1. Движение окна должно следовать за движением мыши, и логическая последовательность не может быть отменена.
  2. Для z это фиксированное значение, и его нужно определять только в начале. Его можно рассматривать как константную переменную, поэтому его можно использовать как закрытый член; но y нельзя использовать как закрытый член. Если переменная фиксируется как закрытый член во время нажатия, то при перемещении значение не может быть изменено, а y должно быть значением, которое необходимо изменять каждый раз при перемещении.
  3. Самое главное, что y - это значение положения левой кнопки мыши относительно верхнего левого угла рабочего стола, и его изменение вызывает изменение окна.

Эффект тени


9. Главный виджет можно скрыть, задав атрибуты виджета.

Читайте также: