Макрос QOT SLOT, используемый в качестве аргумента функции

Я просматриваю пример калькулятора, который был установлен с Qt 5.1.1, и есть частная функция, используемая для создания виджетов кнопок (Button наследует QToolButton):

Button *Calculator::createButton(const QString &text, const char *member)
{
Button *button = new Button(text);
connect(button, SIGNAL(clicked()), this, member);
return button;
}

В примере вызывается вышеуказанная функция для создания нескольких разных кнопок, например:

createButton(tr("Clear"), SLOT(clear()));

Где void clear () был объявлен как частный слот. Я понимаю, что код пытается сделать, но я хочу знать, почему работает передача SLOT (clear ()) в качестве члена const char *. Кажется, я не могу найти много онлайн, который объяснил бы использование SLOT таким образом.

2

Решение

Как вы можете видеть в документация метода подключения, сигнатура функции ожидает тип const char *. Это соответствующие определения из QtCore:

Q_CORE_EXPORT const char *qFlagLocation(const char *method);
...
# define SLOT(a) qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)

Это немного сложнее, и вы можете увидеть детали здесь, но я упростил это ради объяснения и понимания.

Этот «старый» синтаксис сигнального слота, в основном, основан на «строках», и это также является его фундаментальным недостатком. Однако это было исправлено в Qt 5. Теперь это ближе к тому, что вы, похоже, подразумеваете в своем вопросе, так что вы скорее ожидаете, что он будет указателем на функцию или метод, поскольку в конечном итоге вы передаете такой элемент токенам SLOT и SIGNAL.

Для полноты, соответствующие токены SIGNAL и SLOT (то есть Q_SLOTS, Q_SIGNALS и т. Д.) Обрабатываются компилятором мета-объекта aka. moc, способ, которым он помещает их в файлы «.moc». Вы можете увидеть это сами, если откроете эти файлы. Для получения более подробной информации, посмотрите исходный код moc, который можно найти здесь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]