
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.16] |
![]() |
|
![]() |
|
|
Здравствуйте!
Для лучшего понимания взаимодействия сигнал-слот решил проработать примеры из книги Шлее М. "QT 5.10...". В примере к второй главе не понял, где определена функция setNum(), используемая в строке ![]() ![]() QObject::connect(&counter, SIGNAL(counterChanged(int)), &lbl, SLOT(setNum(int))); Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
Цитата tumanovalex @ В примере к второй главе не понял, где определена функция setNum(), используемая в строке Определена тут. |
Сообщ.
#3
,
|
|
|
Правильно я понимаю, что стандартные методы виджетов указываются в connect без указания класса, т.е. без QLabel::, если подключен QtWidgets?
|
Сообщ.
#4
,
|
|
|
Цитата tumanovalex @ Правильно я понимаю, что стандартные методы виджетов указываются в connect без указания класса, т.е. без QLabel::, если подключен QtWidgets? Те варианты connect, которые приведены в примере - это устаревшие способы. На сегодняшний день используется новый (современный) синтаксис. Смотри примеры, как нужно писать сегодня: ![]() ![]() // было QObject::connect(&cmd, SIGNAL(clicked()), &counter, SLOT(slotInc())); // нужно писать QObject::connect(&cmd, &QPushButton::clicked, &counter, &Counter::slotInc); ![]() ![]() // было QObject::connect(&counter, SIGNAL(counterChanged(int)),&lbl, SLOT(setNum(int))); // нужно писать QObject::connect(&counter, &Counter::counterChanged, &lbl, static_cast<void (QLabel::*)(int)>(&QLabel::setNum)); ![]() ![]() // было QObject::connect(&counter, SIGNAL(goodbye()), &app, SLOT(quit())); // нужно писать QObject::connect(&counter, &Counter::goodbye, &app, &QApplication::quit); Как видно, в новом синтаксисе мы и сигналы, и слоты однозначно квалифицируем названиями классов. Это гораздо удобнее и читабельнее. Но есть и нюанс ... Посмотри второй пример. Поскольку у класса QLabel два одноимённых слота с разными сигнатурами void setNum(int num) и void setNum(double num), то компилятор тупит и выбрасывает ошибку, если не использовать static_cast, как я указал в примере. Но такое бывает очень редко, поэтому новый синтаксис connect вполне себя оправдывает. |
Сообщ.
#5
,
|
|
|
Спасибо за пояснения!
|
Сообщ.
#6
,
|
|
|
Правильно я понимаю, что при новом синтаксисе не нужно использовать emit? Я его убрал из кода и все нормально работает. А когда его нужно использовать (без него не обойтись даже в случае нового синтаксиста)?
|
Сообщ.
#7
,
|
|
|
Цитата tumanovalex @ Правильно я понимаю, что при новом синтаксисе не нужно использовать emit? Я его убрал из кода и все нормально работает. А когда его нужно использовать (без него не обойтись даже в случае нового синтаксиста)? emit нужен для посылки сигнала, так что это по прежнему нужно. Другой вопрос, если сигнал не соединен со слотом с помощью connect - слот не отработает. Лучше почитай что-то типа этого. |