Qt как сделать окно активным

Обновлено: 19.05.2024

Класс QWidget - это базовый класс для всех объектов пользовательского интерфейса.

Виджет, который не включен в родительский виджет называется окном. Обычно, окна имеют строку рамку и строку заголовка, хотя можено создать виджет и без таких художественных элементов используя соответствующие флаги окна). В Qt класс QMainWindow и различные подклассы QDialog наиболее распространенные типы окон.

Виджет не имеющий родительского виджета всегда является независимым окном.

Виджет не являющийся окном - это дочерний виджет. Они - дочерние окна внутри родительского окна. Вы не можете визуально отличить дочерний виджет от родителя. Большинство виджетов Qt полезны именно как дочерние виджеты. (Можно сделать кнопку в окне, но большинство людей предпочитают помещать свои кнопки в другие виджеты, например в QDialog.)

Если Вы хотите использовать QWidget как контейнер дочерних элементов, Вы, скорее всего, захотите управляеть их расположением внутри родителя QWidget. (См. Layouts.)

QWidget имеет множество функций-члено, но некоторые из них имеют весьма ограниченную функциональность: наприме, QWidget имеет свойство управляющее шрифтом, но никогда не использует его непосредственно. Есть множество его подклассов, которые обеспечивают реальную функциональность, такие как QPushButton, QListWidget, QTabWidget и т.д.

Группы функций:

Каждый конструктор виджета принимает один или два стандартных аргумента:

  1. QWidget *parent = 0 - это родитель нового виджета. Если равно 0 (по умолчанию), то новый виджет будет окном. Если нет - будет дочерним объектом по отношению к parent и будет находиться в пределах геометрии parent (если Вы не определяете Qt::Window как флаг окна).
  2. Qt::WFlags f = 0 (когда есть) устанавливает флаги окна; значения по умолчанию подходят почти для всех виджетов, но получить, например, окно без рамки, Вы можете используя специальный флаг.

Пример widgets/calculator является хорошим образцом простого виджета. Он содержит обработчик событий (как положено всем виджетам), характерные для ситуации (как все полезные виджеты), и имеет дочерние объекты и соединения. Все это работает реагируя на события: это - наиболее распространенный способ проектирования приложений с GUI.

Вы должны создать содержимое Вашего виджета самостоятельно, но можно привести краткое изложение событий начиная с более общих:

Если Ваш виджет предназначен только для того, чтобы быть контейнером для дочерних объектов, то, вероятно, Вам не придется реализовывать никаких обработчиков событий. Если Вы хотите отслеживать нажатия мыши в дочерних объектах, вызывайте функцию дочернего элемента underMouse() внутри функции mousePressEvent() родительского виджета.

    () - вызывается всякий раз, когда нажимается клавиша, а также при удержании клавиши, достаточном по времени для возникновения автоповтора. Обратите внимание, что нажатия клавиш Tab и Shift+Tab посылаются виджетам только если они не используются механизмом смены фокуса. Для обработки нажатия этих клавиш, Вы должны повторно реализовать QWidget::event(). () - вызывается когда виджет получает фокус ввода клавиатуры (предоположительно вызван setFocusPolicy()). Хорошо написанный виджет показывает, что они имеет фокус ввода клавиатуры ясным, но безопасным способом. () - вызывается когда виджет теряет фокус ввода клавиатуры.

При реализации виджета необходимо рассмотреть еще несколько вещей.

Начиная с Qt 4.0, QWidget автоматически снабжается двойной буферизацией при рисовании, так что нет необходимости для избежания мерцания писать код двойной буферизации в paintEvent().

Описание Свойств

acceptDrops : bool

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

Если виджет является рабочим столом (QWidget::(windowType() == Qt::Desktop)), это может привести к сбоям, если другое приложение использует рабочий стол; чтобы проверить, происходит-ли это, можно использовать acceptDrops().

accessibleDescription : QString

Данное свойство содержит описание виджета используемое вспомогательными технологиями.

accessibleName : QString

Данное свойство содержит имя виджета используемое вспомогательными технологиями.

autoFillBackground : bool

Данное свойство указывает, должен ли виджет отрисовывать свой фон автоматически.

Кроме того, если не установлен атрибут WA_OpaquePaintEvent or WA_NoSystemBackground, Windows всегда заполняет фон с QPalette::Window.

This property was introduced in Qt 4.1.

baseSize : QSize

Данное свойство содержит базовый размер виджета.

Базовый размер используется для вычисления размера виджета, если у виджета определен sizeIncrement().

childrenRect : const QRect

Данное свойство содержит прямоугольник ограничивающий дочерние объекты виджета.

Скрытые дочерние объекты исключаются.

childrenRegion : const QRegion

Данное свойство содержит объединенную область занятую дочерними объектами виджета.

Скрытые дочерние объекты исключаются.

contextMenuPolicy : Qt::ContextMenuPolicy

Данное свойство содержит правила показа контекстного меню.

cursor : QCursor

Данное свойство содержит форму курсора мыши для виджета.

Курсор мыши примет эту форму когда окажется поверх виджета. См. список предопределенных объектов курсора мыши для набора полезных форм.

Виджет редактора мог бы использовать I-подобный курсор:

Если курсор не был установлен или после вызова unsetCursor(), то используется курсор родителя. Функция unsetCursor() не оказывает влияния на окна.

enabled : bool

Данное свойство указывает, доступен-ли виджет.

Доступный виджет может общаться с клавиатурой и иышью, недоступный не может.

Некоторые виджеты самостоятельно изменяют свое отображение по другому, когда они недоступны. Например, кнопка может рисоваться более светлым серым цветом. Если Ваш виджет хочет знать, когда он становится доступным или недоступным, Вы иожете использовать соощение changeEvent() с типом QEvent::EnabledChange.

Изменение доступности виджета изменяет доступность всех его дочерних объектов. Все дочерние виджеты предоставляют подобную возможность, если ранее не были явно сделаны недоступными.

focus : const bool

Данное свойство указывает, имеет ли виджет (или его дружественный виджет) фокус ввода клавиатуры.

Эквивалентно QApplication::focusWidget() == this.

focusPolicy : Qt::FocusPolicy

Данное свойство содержит способ, которым виджет получает фокус ввода клавиатуры.

Политика принимает значение Qt::TabFocus если виджет принимает фокус клавиатуры при табулировании (Tab или Shift+Tab), Qt::ClickFocus если виджет принимает фокус при щелчке по нему мышью, Qt::StrongFocus если обоими способами и Qt::NoFocus (по умолчанию) если виджет не принимает фокус вообще.

font : QFont

Данное свойство содержит текущий шрифт виджета.

Функция fontInfo() сообщает шрифт, который фактически используется виджетом.

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

Следующий фрагмент кода устанавливает полужирный шрифт helvetica размером 12 пунктов:

В дополнение к установке шрифта, setFont() уведомляет все дочерние объекты об изменении.

frameGeometry : const QRect

Свойство содержит геометрию рамки виджета по отношению к родительскому виджету включая оконную рамку.

Краткий обзор проблем оконной геометрии здесь: Описание Оконной Геометрии.

frameSize : const QSize

Данное свойство содержит размер виджета включая его рамку.

fullScreen : const bool

Данное свойство указывает, развернут-ли виджет во весь экран.

geometry : QRect

Данное свойство содержит геометрию виджета по отношению к его родительскому виджету исключая рамку.

Компоненты размера регулируюся если они оказались вне диапазона определенного minimumSize() и maximumSize().

Внимание: Вызов setGeometry() внутри resizeEvent() или moveEvent() может привести к бесконечной рекурсии.

Обзор оконной геомерии см. здесь: Описание Оконной Геометрии.

height : const int

Данное свойство содержит высоту виджета исключая оконную рамку.

Обзор оконной геомерии см. здесь: Описание Оконной Геометрии.

isActiveWindow : const bool

Это свойство указывает, является-ли окно данного виджета активным окном.

Активное окно - это окно, которое содержит виджет имеющий фокус ввода клавиатуры.

Когда всплывающее окно видимо, данное свойство равно true для активного окна и и для всплывающего.

layoutDirection : Qt::LayoutDirection

Данное свойство содержит направление размещения виджета.

maximized : const bool

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

Данное свойство уместно тольк для окон.

Обратите внимание, что из-за ограничений некоторых оконных систем, это свойство не всегда содержит верное значение (например, если пользователь X11 максимизирует окно с помощью оконного менеджера, Qt не может отличить эту операцию от любого другого изменения размера окна). Это, как ожидается, будет изменено в лучшую сторону с развитием протоколов оконного менеджера.

maximumHeight : int

Данное свойство содержит максимальную высоту виджета.

maximumSize : QSize

Данное свойство содержит максимальный размер виджета.

Размер виджета не может быть изменет так, чтобы стать больше максимального.

maximumWidth : int

Данное свойство содержит максимальную ширину виджета.

minimized : const bool

Данное свойство указывает, минимизировано-ли окно (до иконки).

Данное свойство уместно только для окон.

minimumHeight : int

Данное свойство содержит минимальную высоту виджета.

minimumSize : QSize

Данное свойство содержит минимальный размер виджета.

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

Установка минимального размера отвергает установку минимального размера в QLayout.

minimumSizeHint : const QSize

Данное свойство содержит рекомендуемую минимальный размер виджета.

Если значение этого свойства - недействительный размер, то считается, что нет рекомендуемого минимального размера.

Реализация по умолчанию minimumSizeHint() возвращает недействительный размер, если нет менеджера расположения для данного виджета, и возвращает рекомендуемый минимальный размер менеджера расположения в противном влучае. Большинство встроенных виджетов повторно реализуют minimumSizeHint().

QLayout никогда не будет приводить размер слишком маленького виджета к рекомендуемому минимальному размеру, если minimumSize() установлен или политика размера установлена в QSizePolicy::Ignore. Если minimumSize() установлен, то предполагаемый минимальный размер будет игнорироваться.

minimumWidth : int

Данное свойство содержит минимальную ширину виджета.

modal : const bool

Данное свойство является-ли виджет модальным.

Данное свойство имеет смысл только для окон. Модальный виджет не позволяет другим виджетам получать фокус ввода.

mouseTracking : bool

Данное свойство указывает, позволено-ли виджету отслеживать перемещения мыши.

normalGeometry : const QRect

Данное совойство содержит геометрию виджета верхнего уровня когда он не максимизирован и не развернут во весь экран.

Для дочерних виджетов это свойство всегда содержит пустой прямоугольник.

palette : QPalette

Данное свойство содержит палитру виджета.

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

pos : QPoint

Данное свойство содержит позицию виджета в пределах родителского виджета.

Если виджет является окном, то свойство содержит его позицию на рабочем столе включая рамку окна.

Функция move() виртуальна и Qt вызывает реализации других, перегруженных move().

Предупреждение: Вызов move() или setGeometry() внутри moveEvent() может привести к бесконечной рекурсии.

Обзор оконной геомерии см. здесь: Описание Оконной Геометрии.

rect : const QRect

Данное свойство содержит внутреннюю геометрию виджета исключая оконную рамку.

Свойство rect эквивалентно QRect(0, 0, width(), height()).

Обзор оконной геомерии см. здесь: Описание Оконной Геометрии.

size : QSize

Данное свойство содержит размер виджета исключая оконную рамку.

Размер виджета подгоняется с учетом minimumSize() и maximumSize(). Для окон минимальный размер, по крайней мере, равен QSize(1, 1) и может быть больше, но это зависит от оконного менеджера.

Предупреждение: Вызов resize() или setGeometry() внутри resizeEvent() может привести к бесконечной рекурсии.

sizeHint : const QSize

Данное свойство содержит рекомендуемый размер виджета.

Если данное свойство содержит недействительный размер, то считается, что рекомендуемый размер не установлен.

Реализация sizeHint() по умолчанию возвращает недействительный размер, если для нет менеджера расположения для данного виджета, и возвращает рекомендуемый размер менеджера расположения в противном случае.

sizeIncrement : QSize

Данное свойство содержит приращение размера виджета.

Когда пользователь изменяет размер виджета, то размер изменяется шагами равными sizeIncrement().width() пикселей по горизонтали и sizeIncrement.height() пикселей по вертикали с baseSize() в качестве базиса. Принимаемые размеры виджета - это неотрицательные числа i и j:

Обратите внимание, что хотя Вы можете устанавливать размеры для любых виджетов, данное свойство влияет только на окна.

Внимание: Приращение размера ни на что не оказывает влияния в Windows и может игнорироваться оконным менеджером в X.

sizePolicy : QSizePolicy

Данное свойство определяет характеристики расположения виджета по умолчанию.

Если есть объект QLayout управляющий дочерними объектами виджета, то используется политика размера определенная для виджета. Если нет такого QLayout, то используется значение этого свойства.

Политика по умолчанию является Предпочтительно/Предпочитаемой, что означает, что размеры виджета могут свободно изменяться, то предпочитает виджет иметь размер, возвращаемый функцией sizeHint(). Кнопкоподобные виджеты заставляют политику размера помнить, что они могут располагаться горизонтально, но установлены вертикально. То-же самое относится к элементам управления lineedit (таких как QLineEdit, QSpinBox или редактируемого QComboBox) и других горизонтально-ориентированных виджетов (таких как QProgressBar). Виджеты типа QToolButton обычно квадратной формы, так что они могут изменяться в обоих направлениях. Виджеты поддерживающие различные направления (такие как QSlider, QScrollBar или QHeader) определяют изменение размер только в соответствующем направлении. Виджеты, которые предоставляют полосы прокрутки (обычно подклассы QScrollView) имеют тенденцию определять, что они могут использовать дополнительное место и что они могут обойтись размером, меньшим, чем sizeHint().

statusTip : QString

Данное свойство содержит определение состояния виджета.

toolTip : QString

Данное свойство содержит оприсание инструмента.

updatesEnabled : bool

Данное свойство содержит разрешение на изменение виджета.

setUpdatesEnabled() обычно используется, чтобы запретить изменение в течение короткого периода времени, например, во избежание мерцания экрана при каких-либо больших изменениях. В Qt виджеты обычно не вызывают мерцания экрана, но в X11 сервер может стирать области экрана при сокрытии виджета до того, как эти области будут заполнены другими виджетами. Запрет редактирования решает эту проблему.

Запрет редактирования виджета неявно устанавливает запрет редактирования для всех его дочерних объектов. Поддержку данной возможности обеспечивают все дочерние виджеты, если они явно не сделаны недоступными для изменение. Изменение разрешения редактирования виджета неявно вызывает update() для виджета.

visible : bool

Данное свойство определяет видим-ли виджет.

Вызов setVisible(false) или hide() явно скрывает виджет. Явно скрытый виджет никогда не будет отображен, адже если все его предки видимы, пока не будет явно показан.

На этом шаге мы рассмотрим особенности создания и использования таких окон .

Модальным называется окно, которое не позволяет взаимодействовать с другими окнами в том же приложении, - пока модальное окно не будет закрыто, сделать активным другое окно нельзя. Например, если в программе Microsoft Word выбрать пункт меню Файл | Сохранить как , откроется модальное диалоговое окно, позволяющее выбрать путь и название файла, и, пока это окно не будет закрыто, вы не сможете взаимодействовать с главным окном приложения.

  • NonModal ( или 0) - окно не является модальным. Это поведение окна по умолчанию;
  • WindowModal ( или 1) - окно блокирует только родительские окна в пределах иерархии;
  • ApplicationModal ( или 2) - окно блокирует все окна в приложении.

Окна, открытые из модального окна, не блокируются. Следует также учитывать, что метод setWindowModality() должен быть вызван до отображения окна.

Получить текущее значение модальности позволяет метод windowModality() . Проверить, является ли окно модальным, можно с помощью метода isModal() - он возвращает True , если окно является модальным, и False - в противном случае.

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

Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

Если запустить приложение и нажать кнопку Открыть модальное окно , откроется окно, выровненное примерно по центру родительского окна (произвести точное выравнивание вы сможете самостоятельно). При этом получить доступ к родительскому окну можно только после закрытия модального окна, второе же окно блокировано не будет. Если заменить атрибут WindowModal атрибутом ApplicationModal , то оба окна будут блокированы.

Обратите внимание, что в конструктор модального окна мы передали ссылку на первое окно и атрибут Window. Если не указать ссылку, то окно блокировано не будет, а если не указать атрибут, окно вообще не откроется. Кроме того, мы объявили переменную modalWindow глобальной, иначе при достижении конца функции переменная выйдет из области видимости, и окно будет автоматически удалено. Чтобы объект окна автоматически удалялся при закрытии окна, атрибуту WA_DeleteOnClose в методе setAttribute() было присвоено значение True .

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

Класс QDialog является базовым классом для диалоговых окон.

Диалоговое окно - это окно верхнего уровня, предназначенное, главным образом, для выполнения коротких задач и непродолжительных взаимодействий с пользователем. QDialogs может быть модальным или не модальным. QDialogs поддерживает расширяемость и может предоставлять возвращаемое значение. Диалоговые окна имеют кнопку по умолчанию. QDialog также может иметь QSizeGrip в правом-нижнем углу (настраивается с использованием setSizeGripEnabled()).

Обратите внимание, что QDialog использует родительский виджет немного иначе, чем другие классы Qt. Диалог - всегда виджет верхнего уровня, но если он имеет родителя, то по умолчанию он расположен поверх и по центру родительского виджета (если он сам не виджет верхнего уровня). Он также доступен через панель задач родителя.

Модальные Диалоги

Модальный диалог - это диалог, который блокирует ввод в другие окна своего приложения. Пользователь должен завершить работу с диалогом и закрыть его прежде, чем получит доступ к другим окнам приложения. Диалоги, запрашивающие указание пользователем имени файла и устанавливающие настройки приложения, обычно модальны.

Обычно, модальный диалог отображается с помощью вызова функции exec(). При закрытии пользователем диалога, exec() для удобства предоставляет возвращаемое значение. Обычно, для закрытия диалога и получения соответствующего вначения, соединяют сигнал кнопки по умолчания, например, "OK", со слотом accept(), а кнопки "Cancel" со слотом reject(). В качестве альтернативы, Вы можете вызвать слот done() с Accepted или Rejected.

Также можно вызвать setModal(true) или setWindowModality(), а затем show(). В отличие от exec(), show() немедленно возвращает управления вызывающему. Вызов setModal(true) особенно полезен для диалогов, содержащих полосу прогресса, диалогов, которые должны имень возможность взаимодействия с пользователем (например, для отмены долгой операции). Если Вы используете show() совместно с setModal(true) то периодически, в течение обработки, должны вызывать QApplication::processEvents() для обеспечения возможности взаимодействия с пользователем. (См. QProgressDialog.)

Немодальные Диалоги

Немодальный диалог - это диалог, работающий независимо от других окон этого приложения. Диалоги поиска и замены в текстовых редакторов часто немодальны, что позволяет взаимодействовать и с главным окном приложения и с диалогом.

Немодальные диалоги отображаются с использованием функции show(), которая немедленно возвращает управление вызывающему.

Кнопка по Умолчанию

Кнопка диалога по умолчанию - это кнопка, которая нажимается при нажатии пользователем клавиши клавиатуры Enter (Return). Данная кнопка используется для указания того, что пользователь принимает установки диалога и хочет закрыть диалог. Для настройки кнопки по умолчанию используются QPushButton::setDefault(), QPushButton::isDefault() и QPushButton::autoDefault().

Клавиша Escape

Расширяемость

Расширяемость - это возможность отобразить диалог двумя способами: отображение части диалога, содержащей наиболее часто используемые опции, и оторажение полного диалога, содержащего все опции. Обычно, сперва отображается часть расширяемого диалога, содержащего фиксируемую кнопку "More". Если пользователь нажимает кнопку "More", то отображается полный диалог. Расширяемый виджет изменяет размеры в своем sizeHint(). Если его ориентация равна Qt::Horizontal то height() расширяемого виджета увеличится до height() диалога. Если ориентация равна Qt::Vertical, то width() расширяемого виджета увеличится до width() диалога. Расширяемость управляется с помощью setExtension(), setOrientation() и showExtension().

Возвращаемое Значение (Модальные Диалоги)

Модальные диалоги части используются в ситуациях, когда требуется возвращаемое значение, например, чтобы знать, нажал ли пользователь "OK" или "Cancel". Диалог может быть закрыт с помощью вызова слота accept() или reject(), и тогда exec() возвратит Accepted или Rejected соответственно. Вызов exec() возвращает результат работы диалога. В случае, если диалог не был закрыт, результат также доступен через result().

Примеры Кода

Описание Типов Членов

enum QDialog::DialogCode

Значение, возвращаемое модальным диалогом.

КонстантаЗначение
QDialog::Accepted1
QDialog::Rejected0

Описание Свойств

modal : bool

Данное свойство указывает, будет ли диалог, отображаемый с помощью функции show(), модальным или немодальным.

По умолчанию данное свойство равно false и show() оторазит немодальным диалог. Установка данного свойства в true эквивалентна установке QWidget::windowModality в Qt::ApplicationModal.

exec() ингнорирует значение данного совойства и всегда отображает модальный диалог.

sizeGripEnabled : bool

Данное свойство указывает, отображается ли значек расширения диалога.

Если данное свойство позволяет, QSizeGrip размещается в правом-нижнем углу диалога. По умолчанию значек расширения недоступен.

Описание Функций-Членов

QDialog::QDialog ( QWidget * parent = 0, Qt::WFlags f = 0 )

Создает диалог с родителем parent.

Диалог всегда является виджетом верхнего уровня, но, если он имеет родителя, то по умолчанию он занимает центральное положение отностительно родительского окна поверх него. Также, диалог доступен через панель задач родителя.

Флаги виджета f передаются в конструктор QWidget. Если, например, Вы не хотите иметь в строке заголовка виджета кнопку What's This, передайте в f Qt::WindowTitleHint | Qt::WindowSystemMenuHint.

QDialog::~QDialog ()

Разрушает QDialog удаляя все его дочерние объекты.

void QDialog::accept () [virtual slot]

Скрывает модальный диалог и устанавливает код возврата в Accepted.

void QDialog::accepted () [signal]

Данный сигнал испускается, когда диалог "принимается" пользователем (нажата кнопка OK или подобная) и когда вызывается accept() или done() с аргументом QDialog::Accepted.

Обратите внимание, что данный сигнал не испускается при сокрытии диалога с помощью hide() или setVisible(false), а также при удалении диалога в то время, когда он видим.

Данная функция добавлена в Qt 4.1.

void QDialog::done ( int r ) [virtual slot]

Как и в случае QWidget::close(), done() удаляет диалог, если флаг Qt::WA_DeleteOnClose установлен. Если диалог является главным виджетом приложения, то приложение завершается. Если диалог - поледнее закрываемое окно приложения, то испускается сигнал QApplication::lastWindowClosed().

int QDialog::exec () [slot]

Отображает диалог как модальный, блокируя ввод в другие окна пока диалог не будет закрыт. Данная функция возвращает DialogCode.

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

Обратите внимание на то, что exec() игнорирует значение свойства QWidget::windowModality и всегда открывает диалог как с Qt::ApplicationModal.

QWidget * QDialog::extension () const

Возвращает расширение диалога или, если расширение не было определено, 0.

void QDialog::finished ( int result ) [signal]

Данный сигнал испускается при установке кода результата диалога (result) пользователем или с помощью done(), accept() или reject().

Обратите внимание, что данный сигнал не испускается при сокрытии диалога с помощью hide() или setVisible(false), а также при удалении диалога в то время, когда он видим.

Данная функция добавлена в Qt 4.1.

Qt::Orientation QDialog::orientation () const

Возвращает ориентацию расширения диалога.

void QDialog::reject () [virtual slot]

Скрывает модальный диалог и устанавливает код возврата в Rejected.

void QDialog::rejected () [signal]

Данный сигнал испускается, когда диалог "не принимается" пользователем (нажата кнопка Cancel или подобная) и когда вызывается reject() или done() с аргументом QDialog::Rejected.

Обратите внимание, что данный сигнал не испускается при сокрытии диалога с помощью hide() или setVisible(false), а также при удалении диалога в то время, когда он видим.

Данная функция добавлена в Qt 4.1.

int QDialog::result () const

Возвращает код возврата модального диалога, Accepted или Rejected.

Не вызывайте данную функцию, если диалог был создан с атрибутом Qt::WA_DeleteOnClose.

void QDialog::setExtension ( QWidget * extension )

Устанавливает виджет extension в качестве расширения диалога, удаляя предыдущее расширение. Диалог становится собственником расширения. Обратите внимание, что, если Вы передаете 0 в данную функцию, то сущестующее расширение удаляется.

Данная функцию должна вызываться только если диалог закрыт.

void QDialog::setOrientation ( Qt::Orientation orientation )

Если orientation равно Qt::Horizontal, то расширение будет отображаться справа от основной части диалога. Если orientation равно Qt::Vertical, то расширение будет отображаться снизу от основной части диалога.

void QDialog::setResult ( int i )

Устанавливает код возврата модального диалога в i.

void QDialog::showExtension ( bool showIt ) [slot]

Если showIt равно true, то расширение диалога отображается; в противном случае расширение скрывается.

Данный слот полезно соединить с сигналом QPushButton::toggled() виджета QPushButton.

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

А теперь задали тот же вопрос, но уже применительно для QML. Итак, посмотрим, как это реализовать на QML.

Структура проекта

  • question4.pro - профайл проекта, создаётся по умолчанию и не изменяется;
  • main.cpp - основной файл исходных кодов, создаётся по умолчанию и не изменяется;
  • main.qml - основной файл qml с главным окном приложения;
  • AnotherWindow.qml - тип второстепенных окон проекта.

AnotherWindow.qml


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

  1. 1. Структура проекта
  2. 2. AnotherWindow.qml
  3. 3. main.qml
  4. 4. Итог
  5. 5. Видеоурок

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

То есть объявляется сам signal и далее идёт его название. Обработчик же этого сигнала будет определяться в коде следующим образом:

А вызывается сигнал как функция, что и показано в ниже следующем программном коде второстепенного окна приложения.

main.qml


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

В результате будет реализовано переключение между окнами приложения уже на QML, и при этом у Вас будет открыто всегда только одно окно приложения. Демонстрацию работы приложения Вы можете увидеть в видеоуроке.

Видеоурок

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

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

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

На днях один из читателей обратился ко мне за помощью по поводу вопроса, ответ на который он искал в интернете. У меня не так много свободного времени, но видимо звёзды сошлись так, что и время было и вопрос из разряда тех, в которых уже имелся определённый опыт.

Так вот, суть вопроса заключалась в том, чтобы организовать переключение между главным окном и второстепенными. Да таким образом, чтобы открытое окно закрывалось, а вместо него открывалось второе окно. То есть, чтобы по нажатию кнопки в главном окне приложения открывать другое окно и одновременно закрывать главное окно. При это во втором окне содержится кнопка, по нажатию которой открывается главное окно, а второе окно закрывается соответственно.

Структура проекта


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

  • anotherwindow.h - заголовочный файл второстепенного окна;
  • anotherwindow.cpp - файл исходных кодов второстепенного окна.
  1. 1. Структура проекта
  2. 2. Внешний вид окон
  3. 3. main.cpp
  4. 4. mainwindow.h
  5. 5. mainwindow.cpp
  6. 6. anotherwindow.h
  7. 7. anotherwindow.cpp
  8. 8. Итог. Переключение между окнами
  9. 9. Видеоурок

Внешний вид окон

Накидываем вот такие окошки с помощью дизайнера интерфейсов и в путь к программному коду.


Переключение между окнами. Главное окно


Переключение между окнами. Второстепенное окно

main.cpp

Данный файл, с которого стартует приложение, создаётся по умолчанию. Ничего здесь не меняем.

mainwindow.h

В заголовочном файле главного окна приложения необходимо подключить заголовочный файл окна второстепенного приложения.

mainwindow.cpp

Инициализация обоих второстепенных окон производится в главном окне и с помощью системы сигналов и слотов эти окна показываются по сигналам от кнопок в главном окне. При этом главное окно будет закрываться.

anotherwindow.h

anotherwindow.cpp

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

Итог. Переключение между окнами

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

Видеоурок

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

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

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

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