Итак, прошлый раз мы разбирали шаблон приложения, сгенерированный QtCreator. На этот раз я обещал, что оно будет делать что-то. Начнём с окна дизайнера QtCreator (перейти к нему можно по двойному щелчку по mainwindow.ui). Давайте рассмотрим различные части окна одну за другой.
Список виджетов - область, в которой показаны все доступные виджеты. Имеется два режима отображения: в виде списка и в виде значков. Я предпочитаю режим значков (показанный на рисунке), но режим отображения списка может быть полезным для начинающих. Сменить режим можно из контекстного меню. Для добавления виджета на форму достаточно перетащить его отсюда в место назначения.
Окно свойств - здесь отображаются настройки для текущего виджета. Попробуйте выделить виджет на форме или саму форму и вы получите полный набор свойств, доступных для настройки.
В иерархии объектов показано как всё связано между собой. Например, все виджеты будут размещены внутри экземпляра QMainWindow (названого MainWindowClass). Если вы используете интерфейс с закладками, вы увидите, что виджеты разместятся внутри их.
Список действий содержит действия - особые классы, позволяющие использовать один и тот же объект для панели инструментов, главного меню и сочетаний клавиш.Это действительно удобно при создании классических десктоп-приложений.
Панель инструментов Дизайнера - просто панель инструментов, размещённая в Дизайнере - инструменте, используемом для редактирования .ui файлов. Здесь вы можете переключатся между рабочими режимами дизайнера (редактирование, связи, друзья, порядок обхода виджетов), а также применять и отменять макеты.
Все эти списки и панели инструментов окружают вашу форму, главное окно, диалоговое окно, или виджет, которые в данный момент вы разрабатываете.
Какая всё же разница между виджетом, диалоговым окном и главным окном? Всё, что вы видите на экране - виджет. Это и кнопки, и метки, и окна верхнего уровня. Что дополнительно есть у диалогового или главного окна? Диалоговое окно может быть модальным, т.е. показать окно и ожидать действия. Главное окно используется для состыковки других окон, размещения главного меню, панели инструментов, статусной строки. Тогда возникает вопрос: когда создавать виджет? Вы можете создать виджет для объединения набора других виджетов и использовать его при создании диалоговых окон, главного окна или других виджетов или можете использовать его в качестве основы для простого окна, не нуждающегося в дополнительных возможностях главного окна.
На данный момент цель - получить приложение, которое что-то делает. Мы разделим эту цель на две меньшие: запустить свой код и соединится с одним из слотов Qt. Для достижения первой цели необходимо добавить действия, которые позволили бы пользователю что-то сделать с приложением. В главном меню формы написано “Type Here”. Дважды щёлкнете по тексту и напишите “File”. После этого в раскрывшемся меню вы сможете добавить пункты. Пусть их будет два: “Exit” и “Hello Qt”. В списке действий появятся действия (по одному на каждый созданный пункт меню). Здесь вы можете назначить сочетания клавиш, изменить текст пункта меню, добавить для него пиктограмму (пиктограммы берутся из ресурсов и поскольку они пока не обсуждались просто пропустите этот шаг).
Для действия
actionHello_Qt
щёлкните правой кнопкой мышки и выберите Go to slot…. Появится список сигналов. Выберите из этого списка triggered()
. Вы будете перенаправлены к файлу mainwindow.cpp к методу on_actionHello_Qt_triggered
. Этот метод будет выполнен, когда пользователь инициирует действие.В слоте мы просто изменим заголовок окна на “Hello Qt!”, используя код, приведённый ниже. А теперь попробуйте собрать ваше приложение и запустить его. При выборе пункта меню “Hello Qt” изменится заголовок окна. Итак, цель достигнута, приложение что-то делает.
void MainWindow::on_actionHello_Qt_triggered()
{
setWindowTitle( tr("Hello Qt!") );
}
Почему мы поместили строку в функцию tr? Это необходимо для поддержки со стороны инструментов интернационализации, которые предоставляет Qt. Мы рассмотрим этот вопрос немного позже, а пока просто запомните, что все строки, которые видит пользователь, должны быть обёрнуты в вызов функции tr.
Сигнал, вызванный действием
actionHello_Qt
, был автоматически связан с предоставленным слотом. Это может быть удобно в большинстве случаев, но я предпочитаю называть слоты, исходя из того, что они делают, а не в зависимости от того, к чему они присоединены. Это не только улучшает читаемость кода, но и позволяет повторно использовать слот для разных сигналов.Чтобы это сделать необходимо вручную создать связи и именно это я собираюсь сделать для действия
actionExit
. Если посмотреть на конструктор, то мы увидим, что все элементы интерфейса доступны через переменную ui
. Но перед тем как использовать элементы, доступные из указанной переменной, необходимо вызвать функцию setupUi
. Как раз после этого вызова вполне естественно прописать связь, а также инициализировать пользовательский интерфейс.В нашем случае мы свяжем сигнал
triggered()
для действия actionExit
со слотом close
. Это значит, что когда пользователь выполнит это действие, окно закроется, что в свою очередь приведёт к завершению приложения. Поскольку слот для закрытия назван close
, а не on_actionExit_triggered
, необходимо создать связь вручную. Такое название не только вынуждает создать связь вручную, но и делает использование слота более прозрачным, особенно когда его вызов осуществляется в другом месте кода, как обычной функции-члена.
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindowClass)
{
ui->setupUi(this);
connect( ui->actionExit, SIGNAL(triggered()), this, SLOT(close()) );
}
На сегодня достаточно. В следующий раз я планирую рассказать более подробно о сигналах и слотах.
Комментарии