Тип аргумента для сигнала Qt и слота, имеет ли значение ссылочный квалификатор const? - PullRequest
21 голосов
/ 20 декабря 2009

Для сигнала и слота ниже типа

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 используется несовместимый тип. Я думал, что механизм сигнального слота способен обнаруживать ошибку типа аргумента во время компиляции.

Ответы [ 2 ]

26 голосов
/ 20 декабря 2009

Qt проверяет нормализованную подпись , что означает

Нормализация уменьшает количество пробелов до минимум, перемещается «const» вперед при необходимости удаляет const из типов значений и заменяет const ссылки со значениями.

4 голосов
/ 20 декабря 2009

Отказ от ответственности: Мой qt довольно ржавый, но механизм сигнала / слота - это всего лишь вызовы функций C ++. Если механизм «сигнал / слот» фактически копирует объекты во внутреннюю память, мои извинения (вам нужно проверить страницы Qt, там есть большой сигнал о сигналах / слотах), поскольку приведенные ниже биты будут актуальны только в контексте 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) все разные.

...