как в QT выполняется связь между сигналом и слотом?

Я довольно давно занимаюсь программированием на Qt и понимаю большинство общих возможностей Qt. Я все еще не понимаю, как оператор connect соединяет сигналы со слотом во время выполнения. В основном я хотел бы понять, что происходит во время компиляции и что происходит во время выполнения ..

время компиляции: компилятор метаобъектов сгенерирует код для реализации сигнала в дополнительном файле cpp (по одному для каждого класса, содержащего Q_OBJECT).

время выполнения: сигнал отображается в слот, слот выполняется? это та часть, о которой я не понимаю ... SIGNAL и SLOTS - это макросы, которые расширяются до строкового представления имен сигналов / слотов ... как это и метаобъект помогают в отображении вызовов на слоты во время выполнения? подробности будут оценены ...

РЕДАКТИРОВАТЬ: эта ссылка даст вам лучшее представление .. (только если вас интересуют кровавые подробности ...) http://dev.libqxt.org/libqxt/wiki/Meta_Object_Format

соедините это с документацией QMetaObject, и все станет ясно ...


person maxpayne    schedule 14.03.2011    source источник


Ответы (2)


Есть несколько способов подключить сигнал к методу (сигнал / слот).

Однако все они вращаются вокруг получения правильного номера метода.

После того, как у вас есть правильный номер метода и объект для его вызова, вы просто вызываете виртуализированную функцию (qt_metacall) в QObject, которая находит правильный метод для вызова по заданному номеру. Вы можете найти эту функцию в файлах, которые генерирует MOC. Кроме того, в этом сгенерированном файле вы можете найти строку, которая создает статический QMetaObject вашего класса. Этот объект регистрирует имена ваших слотов и сигналы для номеров методов.

Они могут дать кое-что интересное для чтения:

http://doc.qt.io/qt-5/qmetaobject.html
http://doc.qt.io/qt-5/metaobjects.html
http://doc.qt.io/qt-5/signalsandslots.html

Вы также можете многому научиться, запустив активацию слотов с помощью отладчика.

person 0xbaadf00d    schedule 14.03.2011
comment
спасибо за ответ .. я вижу функцию qt_metacall в сгенерированном в файле moc .... но файл moc исходного объекта содержит информацию только о сигнале, а не о слоте ... так как же он находит слот? - person maxpayne; 14.03.2011
comment
Я не уверен, понимаю ли я. Слоты и сигналы регистрируются через статический мета-объект, созданный в файле MOC. В файле MOC нет списка ваших слотов? Должен, мой. Это может сбивать с толку, поскольку все сигналы и слоты находятся в одной куче. Не могли бы вы дать более подробное объяснение, чтобы я мог понять. - person 0xbaadf00d; 14.03.2011

В основном сигналы и слоты работают аналогично сообщениям в Objective-C.

Макросы заставляют препроцессор заменять их некоторым кодом, который «регистрирует» и «ищет» функции / методы, которые должны эффективно выполняться при вызове слота.

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

Если вы знакомы с C / C ++, вы можете сравнить это с динамическими библиотеками. Символы просматриваются во время выполнения, и их адрес затем используется, чтобы позволить процессору "перепрыгнуть" к ним для выполнения.

Кроме того, эти ссылки могут вам помочь:

person BastiBen    schedule 14.03.2011
comment
спасибо за ответ ... я искал подробные сведения ... я хорошо знаком с документацией QT и другими сообщениями. меня особенно интересует, как и где эта сгенерированная подпись ищется во время выполнения и какую роль выполняет мета-объект играть в это .. - person maxpayne; 14.03.2011
comment
Как насчет этого? doc.qt.nokia.com/latest/ и этот doc.qt.nokia.com/latest/metaobjects. html # meta-object-system - person BastiBen; 14.03.2011