2009-10-14 4 views
6

Я знаю, что могу использовать QSignalMapper для вызова слота с различными параметрами на основе соединения. То, что я хочу достичь, немного отличается.Qt Карта Сигналы на основе значения параметра

Мы используем плагины в нашем приложении, и разные плагины отвечают за различные типы объектов. Мы подключаем несколько слотов, каждый из которых реализован в другом плагине, к одному сигналу, испускаемому основным приложением. Одним из параметров сигнала является QString, указывающий тип объекта, связанный с сигналом. В настоящее время мы проверяем этот параметр в слотах и ​​продолжаем, если тип обрабатывается плагином. Это имеет недостаток, каждый плагин выполняет эту проверку, и я хочу избежать этого, если это возможно.

Я хочу подключить все слоты к одному и тому же сигналу, и когда сигнал испускается, вызывается только соответствующий слот в зависимости от значения аргумента QString, вроде как QSignalMapper, но по-другому.

Есть ли встроенный механизм для этого? Если нет, какие-либо идеи о том, как я могу это достичь?

Заранее спасибо.

ответ

3

Я не думаю, что есть компонент для этого, но вы можете создать свой собственный картограф сигналу, как это:

  1. создать MySignalMapper компонент
  2. закодировать addSourceSignal метод, чтобы установить сигнал основных app
  3. code addDestinationSlot метод, который принимает пару QString/slot и отображает строку в слот.
  4. в вашем компоненте подключите исходный сигнал к пользовательскому слоту, который отправляет на основе значения qstring. Вы можете вызвать слот с QMetaObject :: invokeMethod.
0

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

Другими словами, вы можете сделать то, что QMetaObject::connectSlotsByName, за исключением того, чтобы реализовать свое собственное соглашение об именах.