К основному контенту

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


Сигналы и слоты - одни из ключевых компонентов, которые делают Qt особенной. Они позволяют связать события со слотами таким образом, что вы можете обработать не только нажатие кнопки, выбор флажков, редактирование текста, но и изменение значений, таймауты по таймеру и много другого.
Чтобы ваше Qt приложение что-то делало, нужно только связать сигналы со слотами. Это можно сделать тремя способами. Прошлый раз мы рассмотрели два из них; давайте повторим.
Связь по имени. В этом случае слот называется по шаблону on_widget_signal. Эта связь создаётся, когда вы вызываете setupUi и связываете простые события со слотом. Имена слотов не всегда наилучшие с точки зрения читаемости и повторного использования, но зато это просто и быстро. Также этот тип связи может быть создан по правому щелчку кнопкой мышки в окне Дизайнера QtCreator'а.
Связывание с использование метода connect. Указывая объект-источник сигнала, имя сигнала, целевой объект и имя слота, вы можете связать любой сигнал с любым слотом.
И наконец, последний способ:
Связывание с использованием Дизайнера. В этом случае связи "рисуются" в Дизайнере. Этот способ и будет рассмотрен сегодня.

Раньше мы пользовались шаблоном, сгенерированным QtCreator'ом, основанном на использовании QMainWindow. В этот раз мы воспользуемся шаблоном, основанном на QWidget. Для создания такого проекта воспользуйтесь мастером по созданию Qt 4 Gui проекта и убедитесь, что используется QWidget вместо QMainWindow в качестве базового класса.





После этого перейдите к файлу widget.ui, дважды щёлкните по нему, чтобы открылось окно Дизайнера. Здесь, перетащите QPushButton на виджет и измените текст на ней на “Close”. Вы можете сделать правый щелчёк кнопкой мышки и выбрать изменить текст или просто щёлкнуть дважды и отредактировать текст на месте.





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





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





Когда вы отпустите кнопку мышки, появится диалог с доступными сигналами. Выберите сигнал clicked() и соедините его со слотом close(). Вам нужно будет установить флажок show signals and slots inherited from QWidget, чтобы увидеть слот.





Вот и всё - вы создали связь. Сохраните файл widget.ui, соберите и запустите приложение и вы сможете протестировать кнопку.

Комментарии

Популярные сообщения из этого блога

Одно приложение, несколько баз данных

Рецепт от Spring Boot Некоторое время назад мне довелось писать агрегатор информации, разбросанной по нескольким базам данных с разными схемами. Для реализации был выбран Spring Boot. Ну, потому что модный и судя по примерам существенно упрощает жизнь за счет умной автоконфигурации. В этой статье я опишу, что же необходимо сконфигурировать и как, в случае, если вы отошли от стандартного сценария. Первым делом, необходимо прописать настройки доступа к каждой из баз. Например, вот так: Следующим шагом создадим отдельный класс конфигурации (для удобства), в котором определим dataSources: Обратите внимание, как просто получить настройки с помощью @ConfigurationProperties. Правда, пришлось ввести вспомогательный класс BaseDataSourceProperties — наследник DataSourceProperties, в котором область видимости метода getDriverClassName расширена до public. И осталось совсем немного — сконфигурировать JPA-репозитории. Насчет немного я, конечно, пошутил :) В этой части предстоит больше ...

Обработка изображений с ImageMagick

ImageMagick ( http://www.imagemagick.org ) — набор утилит для создания, редактирования, конвертирования и просмотра растровых изображений. Графический режим необходим только для просмотра. Для остальных действий над изображениями достаточно консоли. То есть налицо два отличия от привычных редакторов растровых изображений (вроде GIMP или Krita): использование набора утилит вместо одной программы для операций над изображениями не требуется GUI. Очевидно, что таким инструментом вряд ли будут пользоваться художники, фотографы или дизайнеры. Чтобы разобраться для кого предназначен этот набор, предлагаю ознакомиться с предоставляемыми возможностями. Что умеет ImageMagick? Чтобы ответить на поставленный вопрос я перечислю входящие в набор утилиты, напишу какой функционал предоставляет каждая из них и, конечно же, приведу примеры использования. identify — информационная утилита, воспользовавшись которой можно узнать формат изображения и множество других его свойств (например, высоту,...

Изучение Qt маленькими порциями. Разбираем ваше первое приложение

Прошлый раз вы установили QtCreator, а затем сгенерировали ваше первое приложение. Всё сработало и у вас теперь есть собственное пустое окно QMainWindow на экране. Всё хорошо, но что же действительно было сделано? Давайте пройдёмся по сгенерированному коду, чтобы стало понятно, что же случилось на самом деле. Приложение состоит из одного класса и функции main, необходимой для запуска. Давайте посмотрим на эту функцию main.cpp #include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } В этой функции создаётся экземпляр класса QApplication . Каждому приложению Qt нужен один и только один экземпляр класса QApplication. Он представляет собой само приложение и содержит главный цикл обработки событий. Вы можете спросить, что такое цикл обработки событий? Это просто цикл, ожидающий наступления события. Например, нажатие клавишы, перемещение мышки, сетевые пакеты, событ...