2014-03-15 6 views
2

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

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.

+0

Это еще не разрешено через 0 месяцев ?? – lpapp

ответ

1

Как видно из documentation of the connect method, подпись функции ожидает тип 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) 

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

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

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

+0

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

+0

@FrankOsterfeld: я обновил, чтобы быть более четким, что я хотел бы выразить. – lpapp

+0

@ LaszloPapp: Ничего себе, это немного напоминает мою голову, видя, как Я новичок в Qt, но со временем пойму. Спасибо за ответ. – DanielJG

 Смежные вопросы

  • Нет связанных вопросов^_^