Где находится документация о том, что вы не можете удалить параметр из соединения QT Signal Slot, если параметр не с конца?

В документации QT 4.8 говорится, что:

Механизм сигналов и слотов является типобезопасным: сигнатура сигнала должна соответствовать сигнатуре принимающего слота. (На самом деле слот может иметь более короткую подпись, чем сигнал, который он получает, потому что он может игнорировать дополнительные аргументы.) Поскольку подписи совместимы, компилятор может помочь нам обнаружить несоответствия типов.

Однако код вроде:

QObject::connect(&source, SIGNAL(MySignal(QByteArray,QString,bool), &sink, SLOT(MySlot(QByteArray,bool));

выдает ошибку «Несовместимые аргументы отправителя / получателя».

Почему это происходит и где задокументировано, что вам нужно удалить параметры с конца? Я понимаю, что с неявными преобразованиями могут быть проблемы, но я думал, что QT по существу работает с метаданными, которые должны иметь возможность подключать сигнал / слот, как указано выше.


person Robert Duff    schedule 18.07.2017    source источник
comment
Немного бессмысленный вопрос, поскольку это можно легко сделать с помощью синтаксиса Qt5 connect и лямбда. Вы просто используете неправильный метод подключения.   -  person IlBeldus    schedule 18.07.2017


Ответы (1)


[...] он может игнорировать лишние аргументы. [...]

Нет другого способа прочитать это, кроме очевидного.
Признайте на мгновение, что это технически возможно (и это было бы кошмаром, поверьте мне) и рассмотрите приведенное ниже утверждение:

QObject::connect(
    &source,
    SIGNAL(MySignal(QString,QString,QString),
    &sink,
    SLOT(MySlot(QString,QString)
);

Все идет нормально. Если Qt работал так, как вы описали, что QString следует игнорировать?
Следует ли вам ввести набор правил и исключений для обработки этих случаев, чтобы он быстро уводил инструмент сигнальных слотов к черту?


При этом, начиная с C ++ 11, у нас есть лямбда-выражения как часть языка. Qt5 приветствовал их и определил совершенно новый набор connect определений, с помощью которых вы можете делать именно то, что хотите. Рукой. Когда вам это действительно нужно и вы знаете, что делаете. Так что фреймворк не должен пытаться угадать, каковы ваши требования при срабатывании события.

person skypjack    schedule 18.07.2017
comment
Спасибо, до недавнего времени нас не было в QT5 и C ++ 11. У меня все еще возникают проблемы с использованием нового метода вызова QT5 connect (без Lambdas), он жалуется на неопределенную ссылку на staticMetaObject. Обратите внимание, что старое соединение на основе SIGNAL и SLOT отлично работает в одном и том же месте. - person Robert Duff; 18.07.2017
comment
@RobertDuff Вероятно, вы не унаследовали все задействованные типы от QObject. Нелегко сказать, не видя настоящего кода. - person skypjack; 18.07.2017
comment
Класс является интерфейсом, но он является производным от QObject (по отдельности нет проблем с упорядочением в объявлениях базового класса) и реализует макрос Q_OBJECT. Сигнал и деструктор не являются чисто виртуальными, в отличие от всех остальных методов. К сожалению, я не могу копировать и вставлять код или даже редактировать интерфейс, который я использую. - person Robert Duff; 18.07.2017
comment
@RobertDuff Тогда я не знаю, как тебе помочь. Можете ли вы создать минимальный пример для воспроизведения ошибки? - person skypjack; 18.07.2017