В настоящее время я работаю над проектом Qt и несколько запутался с механизмом сигналов и слотов. Я чувствую, однако, что у меня есть некоторое хорошее понимание различий между QObject и формой пользовательского интерфейса.
Форма пользовательского интерфейса (описываемая файлом .ui) подается в компилятор пользовательского интерфейса (uic) и создает связанный файл заголовка. Этот заголовочный файл не просто содержит информацию о интерфейсе, но вместо этого содержит детали реализации в QObject, которые должны быть отформатированы. QObject, с другой стороны, является базовым классом, на котором построена много основы Qt. Системы сигналов и слотов полностью основаны на QObject.
При расширении класса QObject (или из производного класса) вы фактически определяете объект, в котором могут генерироваться сигналы и слоты. Чтобы отформатировать этот объект так, как пользовательский интерфейс, который вы только что создали в Qt Designer, вы создаете экземпляр класса ui (через заголовок ui, сгенерированный uic). Вы вызываете метод установки этого класса и передаете ему новый объект QObject, который вы создаете.
Все это имеет смысл.
Однако, что не имеет смысла, это когда вы начинаете фактически определять сигналы. С помощью Qt Designer у меня есть возможность щелкнуть правой кнопкой мыши и выбрать "сигнал". Когда я выбираю сигнал (будь то щелчок мышью по кнопке или изменение индикатора выполнения), он заканчивает добавление этого в раздел сигналов QObjects. Мой вопрос: почему и как? Как именно мои действия в Qt Designer (программа, которая генерирует XML для uic), связаны с моим QObject в Qt Creator? В частности, как узнать, какой QObject добавить этот слот?
Этот вопрос может быть несколько неясным, поэтому я приведу здесь пример.
Скажем, например, я хочу создать новый интерактивный экран. Позвольте называть его "MyScreen". Для создания этого интерфейса у меня, скорее всего, будет 3 файла: "myscreen.h", "myscreen.cpp" и "myscreen.ui". "myscreen.h" отвечает за объявление свойств и методов QObjects, а также сигналов и слотов. "myscreen.cpp" отвечает за определение методов, сигналов и слотов. "myscreen.ui" является копией для создания макета пользовательского интерфейса, который будет использоваться для форматирования экземпляра MyScreen.
Но из-за того, что я уже говорил ранее, что ui используется только для генерации заголовка, почему именно он связан с "myscreen.cpp" ? То есть, я могу щелкнуть правой кнопкой мыши по макету .ui, создать новый тип сигнала, и этот тип сигнала будет добавлен в myscreen.h и myscreen.cpp. Как это произошло? Как это сочетается? Работает ли Qt так, что должно существовать 3 файла (xxx.h, xxx.cpp, xxx.ui), которые должны существовать?
Надеюсь, это даст вам некоторый контекст в том, о чем я запутался. Кажется, что нет хорошо написанного документа (который я нашел как минимум), который полностью описывает базовую взаимосвязь между всеми этими элементами.
TL;DR - Как сигнал/слот от .h и .cpp на самом деле ссылаются на элементы, определенные в файле .ui?