На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: Majestio
  
> Примеры из книги Шлее
    Здравствуйте!
    Для лучшего понимания взаимодействия сигнал-слот решил проработать примеры из книги Шлее М. "QT 5.10...". В примере к второй главе не понял, где определена функция setNum(), используемая в строке
    ExpandedWrap disabled
      QObject::connect(&counter, SIGNAL(counterChanged(int)), &lbl, SLOT(setNum(int)));
    Помогите, пожалуйста, разобраться. Проект из книги прикрепил.
    Прикреплённый файлПрикреплённый файлch02_Counter.zip (1,83 Кбайт, скачиваний: 31)
    Сообщение отредактировано: tumanovalex -
      Цитата tumanovalex @
      В примере к второй главе не понял, где определена функция setNum(), используемая в строке

      Определена тут.
        Правильно я понимаю, что стандартные методы виджетов указываются в connect без указания класса, т.е. без QLabel::, если подключен QtWidgets?
        Сообщение отредактировано: tumanovalex -
          Цитата tumanovalex @
          Правильно я понимаю, что стандартные методы виджетов указываются в connect без указания класса, т.е. без QLabel::, если подключен QtWidgets?

          Те варианты connect, которые приведены в примере - это устаревшие способы. На сегодняшний день используется новый (современный) синтаксис. Смотри примеры, как нужно писать сегодня:

          ExpandedWrap disabled
            // было
            QObject::connect(&cmd, SIGNAL(clicked()), &counter, SLOT(slotInc()));
            // нужно писать
            QObject::connect(&cmd, &QPushButton::clicked, &counter, &Counter::slotInc);


          ExpandedWrap disabled
            // было
            QObject::connect(&counter, SIGNAL(counterChanged(int)),&lbl, SLOT(setNum(int)));
            // нужно писать
            QObject::connect(&counter, &Counter::counterChanged, &lbl, static_cast<void (QLabel::*)(int)>(&QLabel::setNum));


          ExpandedWrap disabled
            // было
            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 вполне себя оправдывает.
            Спасибо за пояснения!
              Правильно я понимаю, что при новом синтаксисе не нужно использовать emit? Я его убрал из кода и все нормально работает. А когда его нужно использовать (без него не обойтись даже в случае нового синтаксиста)?
                Цитата tumanovalex @
                Правильно я понимаю, что при новом синтаксисе не нужно использовать emit? Я его убрал из кода и все нормально работает. А когда его нужно использовать (без него не обойтись даже в случае нового синтаксиста)?

                emit нужен для посылки сигнала, так что это по прежнему нужно. Другой вопрос, если сигнал не соединен со слотом с помощью connect - слот не отработает.
                Лучше почитай что-то типа этого.
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0258 ]   [ 16 queries used ]   [ Generated: 3.09.25, 03:41 GMT ]