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

Добавил пользователь Валентин П.
Обновлено: 17.09.2024

Здравствуйте, Макс!
В главе 32 приводится пример программы создания собственного диалогового окна. Поставил дополнительную задачу: если значение полей First Name и Last Name (QLineEdit) равно “Иван” или “Иванов”, то выделяй текст.
Реализовал это с помощью создания нового класса MyLineEdit наслудуемого от класса QLineEdit. В классе InputDialog использую элементы своего класса (MyLineEdit).
объявление:
class MyLineEdit : public QLineEdit Q_OBJECT

protected:
virtual void mousePressEvent(QMouseEvent *) override;
>;

реализация:
void MyLineEdit::mousePressEvent(QMouseEvent *) if(text() == “Иван” || text() == “Иванов”) selectAll();
>

Здравствуйте, Вячеслав!
скорее всего Вы просто забыли передать объект события дальше в наследованный класс. То есть код должен вяглядить так
void MyLineEdit::mousePressEvent(QMouseEvent* pe) if(text() == “Иван” || text() == “Иванов”) selectAll();
QLineEdit::mousePressEvent(pe); //. передаем объект события дальше
>

Макс, огромное спасибо за оперативный ответ! Да, всё работает, единственное код должен быть таким в моем случае:
void MyLineEdit::mousePressEvent(QMouseEvent *pe) if(text() == “Иван” || text() == “Иванов”) selectAll();
else QLineEdit::mousePressEvent(pe);
>
Иначе, при клике мышкой по текстовому полю текст не выделяется, как предполагалось (возможно это условие я не обозначил изначально). Смысл условия такой: в поля вписаны имя и фамилия как пример, но при клике мышкой по полю, если там вписаны “Иван”, или “Иванов”, слово-пример должно выделяться, чтобы можно было сразу вводить свои имя и фамилию (если данные, “Иван” и “Иванов”, не подходят).
Спасибо большое за подсказку!

В Главе 32 опечатки на стр. 451: “Метод firstName() возвращает введенную пользователем фамилию…”, имеется ввиду метод lastName(). И на стр. 453: “Затем создаем объект строкового типа strFormat – …”, если брать из листинга, то имелся ввиду объект типа QString – strFilter.

Теперь у меня есть этот код, но он показывает новый модальный диалог (не основанный на моем about.ui):

Решение

Вам нужно настроить диалог с пользовательским интерфейсом, который вы .ui файл. Qt uic Компилятор генерирует файл заголовка из вашего .ui файл, который вам нужно включить в ваш код. Предполагается, что ваш .ui файл называется about.ui и диалог называется About , затем uic создает файл ui_about.h , содержащий класс Ui_About , Существуют разные подходы к настройке пользовательского интерфейса, простейшие

Лучшим подходом является использование наследования, так как оно лучше инкапсулирует ваши диалоги, так что вы можете реализовать любую функциональность, специфичную для конкретного диалога в подклассе:

AboutDialog.h:

AboutDialog.cpp:

Использование:

В любом случае, важным кодом является вызов setupUi() метод.

КСТАТИ: Ваш диалог в приведенном выше коде не является модальным. Чтобы показать модальное диалоговое окно, либо установите windowModality флаг вашего диалога Qt::ApplicationModal или использовать exec() вместо show() ,

Другие решения

Для модальных диалогов, вы должны использовать exec() метод QDialogs.

Наиболее распространенный способ отображения модального диалога — это вызвать его exec() функция. Когда пользователь закрывает диалоговое окно, exec() обеспечит полезное возвращаемое значение.

Альтернативный способ: вы не нужен модальный диалог. Пусть диалог покажет немодальный и подключит его accepted() а также rejected() сигналы в соответствующие слоты. Затем вы можете поместить весь свой код в принимать слот вместо того, чтобы положить их сразу после show() , Таким образом, используя этот способ, вам не нужно модальное диалоговое окно.

15 декабря 2020 mob25


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


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


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


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



Рис.1. Диалоговое окно для перехода на заданную ячейку таблицы


Создание диалогового окна как при ручном кодировании, так и при
использовании Qt Designer предусматривает выполнение следующих шагов:

  • создание и инициализация дочерних виджетов;
  • размещение дочерних виджетов в менеджерах компоновки;
  • определение последовательности переходов по клавише табуляции;
  • установка соединений "сигнал - слот";
  • реализация пользовательских слотов диалогового окна.


Для запуска Qt Designer выберите функцию Qt v 5.X.X | Designer в меню Пуск системы Windows. После старта Qt Designer выдает список шаблонов. Выберите шаблон Widget, затем нажмите на кнопку Cоздать. Вы получите на экране окно с заголовком Form - untitled (рис. 2).



Рис.2. Qt Designer в системе Windows


По умолчанию интерфейс пользователя в Qt Designer оформлен в стиле MDI с одним окном верхнего уровня и несколькими подчиненными окнами. Изменить режим пользовательского интерфейса можно командой Настройки / Настройки. В результате будет открыто диалоговое окно Настройки (рис. 3).



Рис.3. Диалоговое окно Настройки


Рассмотрим этапы проектирования диалогового окна. На первом этапе создайте дочерние виджеты и поместите их в форму. Создайте одну текстовую метку, одну строку редактирования, одну (горизонтальную) распорку (spacer) и две кнопки. При создании любого элемента перенесите его название или пиктограмму из окна виджетов Qt Designer на форму приблизительно в то место, где он должен располагаться. Элемент Распорка, который не будет видим при работе формы, в Qt Designer показан в виде синей пружинки.


Затем передвиньте низ формы вверх, чтобы она стала короче. В результате
вы получите форму, похожую на показанную на рис. 4. Не тратьте слишком
много времени на позиционирование элементов на форме; менеджеры
компоновки Qt позже выполнят точное их позиционирование.



Рис.4. Форма с несколькими виджетами


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

Класс 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.

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