Тип аргумента для сигнала и слота Qt, имеет ли значение задание отступников?
Для сигнала и слота типа ниже
signals: void textChanged(const QString &); public slots: void setText(const QString & text)
тип аргумента textChanged и setText, похоже, работает нестабильно для const и & . Имеет ли постоянная и ссылочная квалификация какую-либо разницу по сравнению с использованием только QString?
QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString))); QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &)));
EDIT: я не заметил окно вывода, отображающее сообщения об ошибках, когда в SIGNAL или SLOT используется несовместимый тип. Я думал, что механизм слота сигнала способен обнаруживать ошибку типа аргумента во время компиляции.
- Какова цель вопросительного знака после типа (например: int? MyVariable)?
- Как вы знаете переменный тип в java?
- Как проверить, наследует ли class другой class, не создавая его?
- Интерфейсы Java и типы возврата
- Каковы различия между типами значений и ссылочными типами в C #?
- Является ли строка типом значения или ссылочным типом?
- C # - как определить, является ли тип числом
- Почему эти уравнения деления приводят к нулю?
- Взаимодействие Java Raw Type и generics
- Использование IsAssignableFrom с открытыми типами
- Производительность TypeCasting
- Почему streamи C ++ используют char вместо unsigned char?
- Когда целесообразно использовать связанный тип по сравнению с общим типом?
Qt проверяет нормализованную подпись , что означает
Нормализация уменьшает пробелы до минимума, при необходимости перемещает «const» на фронт, удаляет «const» из типов значений и заменяет ссылки const со значениями.
Отказ от ответственности: мой qt довольно ржавый, но механизм сигнала / слота по-прежнему остается только вызовом функций C ++. Если механизм сигнала / слота фактически копирует объекты во внутреннее хранилище, мои извинения (вам нужно проверить страницы Qt, есть большой в сигналах / слотах afaik), поскольку биты ниже будут только релевантными в контексте C ++, а не в контексте C ++ + Qt.
Если вы не укажете ссылку, строка будет скопирована (и наличие константы не имеет значения, любые внесенные в нее изменения останутся в функции).
Если вы оставите в ссылке, но выберете const, вы разрешите методу изменять строку, которую вы ему даете. Они оба работают, но выполняют разные вещи с передаваемым вами объектом (количество копий / возможность сохранения изменений).
Предлагаю вам прочитать следующие ресурсы:
(по корректности const) https://isocpp.org/wiki/faq/const-correctness
(по ссылкам) https://isocpp.org/wiki/faq/references
чтобы точно понять, что такое прохождение параметра и как void foo(const A&)
/ void foo(const A)
/ void foo(A&)
/ void foo(A)
все разные.