В приводимых ранее примерах мы всегда подключали разные слоты к разным сигналам. Существует несколько вариантов подключения слотов к сигналам.
• К одному сигналу можно подключать много слотов:
connect(slider, SIGNAL(valueChanged(int)),
spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)),
this, SLOT(updateStatusBarIndicator(int)));
При генерировании сигнала последовательно вызываются все слоты, причем порядок их вызова неопределен.
• Один слот можно подключать ко многим сигналам:
connect(lcd, SIGNAL(overflow()),
this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()),
this, SLOT(handleMathError()));
Данный слот будет вызываться при генерировании любого сигнала.
• Один сигнал может соединяться с другим сигналом:
connect(lineEdit, SIGNAL(textChanged(const QString &)),
this, SIGNAL(updateRecord(const QString &)));
При генерировании первого сигнала будет также генерироваться второй сигнал. В остальном связь «сигнал — сигнал» не отличается от связи «сигнал — слот».
• Связь можно аннулировать:
disconnect(lcd, SIGNAL(overflow()),
this, SLOT(handleMathError()));
Это редко приходится делать, поскольку Qt автоматически убирает все связи при удалении объекта.
• При успешном соединении сигнала со слотом (или с другим сигналом) их параметры должны задаваться в одинаковом порядке и иметь одинаковый тип:
connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),
this, SLOT(processReply(int, const QString &)));
• Имеется одно исключение, а именно: если у сигнала больше параметров, чем у подключенного слота, то дополнительные параметры просто игнорируются:
connect(ftp, SIGNAL(rawCommandReply(int, const QString &),
this, SLOT(checkErrorCode(int)));
Если параметры имеют несовместимые типы либо будет отсутствовать сигнал или слот, то Qt выдаст предупреждение во время выполнения программы, если сборка программы проводилась в отладочном режиме. Аналогично Qt выдаст предупреждение, если в сигнатуре сигнала или слота будут указаны имена параметров.
Метаобъектная система Qt
Одним из главных преимуществ средств разработки Qt является расширение языка С++ механизмом создания независимых компонентов программного обеспечения, которые можно соединять вместе, несмотря на то что они могут ничего не знать друг о друге.
Этот механизм называется
В стандартном языке С++ не предусмотрена динамическая поддержка метаданных, необходимых системе метаобъектов Qt. В Qt эта проблема решена за счет применения специального инструментального средства компилятора
Этот механизм работает следующим образом:
• макрос
• компилятор
• такие функции—члены класса