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

Изучение 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-репозитории. Насчет немного я, конечно, пошутил :) В этой части предстоит больше

Может ли TreeSet содержать дубликаты?

Не спешите давать ответ, а лучше запустите код, приведенный ниже. Возможно вы подумаете, что это надуманный пример, но это лишь немного упрощенная версия того кода, с которым мне пришлось столкнуться на практике. Для начала о проблеме, которую был призван решить этот код. В списке объектов надо было оставить объекты с различными именами, причем неважно какой объект из всего набора с таким же именем останется. Сразу же уточню, что на практике в проекте используется Java 7 и класс объектов, добавляемых в TreeSet, не вложен в какой-либо другой, а приведенный здесь вариант использован для краткости. Может возникнуть вопрос почему выбрано именно такое решение. Давайте разберемся, чтобы не повторять ошибку. Первое, что приходит в голову, когда из списка надо удалить дубликаты, - использовать Set. В данной ситуации HashSet не подходит, потому что он использует equals метод для сравнения и отсеивания дубликатов. Но наш программист не сдаётся и вспоминает, что есть же еще TreeSet, в докум

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

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