как связь между сигналом и слотом осуществляется в QT? - PullRequest
2 голосов
/ 14 марта 2011

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Существуют различные способы подключения сигнала к методу (сигнал / слот).

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

После получения правильногономер метода и объект для его вызова, вы просто вызываете виртуализированную функцию (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

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

0 голосов
/ 14 марта 2011

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

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

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

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

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

...