Глава 2 – Философия объектной модели

Философия объектной модели

Приобрести книгу можно на сайте ozon.ru и в электронном виде на Google Play:
Приобрести книгу о Qt и C++ на Ozon.ru Купить книгу о Qt и C++ на Goole Play

20 thoughts on “Глава 2 – Философия объектной модели

  1. В листинге 2.11 в обоих методах setMapping() первым аргументом является pcmd1, хотя индийская мне подсказывает, что во втором случае должен быть pcmd2

    1. Спасибо Серафим,
      Вы правы во втором методе setMapping() действительно должно стоять pcmd2.
      В следующих изданиях исправлю

  2. Уважаемый автор, в разделе “Механизм сигналов и слотов” рассказывается о функциях обратного вызова. Правильно ли я понимаю, что данный механизм – это когда в функцию передается указатель на другую функцию (эта другая функция и есть функция обратного вызова)?

    1. Да, Сергей, именно так. Вы все правильно поняли! По другому эти функции называются callback.

  3. Добрый день! Во второй главе говориться “слот может принимать сигналы от многих сигналов, принадлежащим разным объектам”. Хочу уточнить: это он может делать напрямую, то есть через использования метода connect(), когда несколько сигналов подключаются к одному и тому же слоту, или необходимо использовать класс QSignalMapper в качестве “программного разветвителя” для слота? Например, можно в листинге 2.11 не создавать объект QSignalMapper* psigMapper и через него подключать сигналы к одному слоту, а просто вызвать два раза метод connect(), где в качестве слота указать одно и то же значение?

    1. Добрый день Игорь!
      Метода QObject::connect() для соединения сигналов и слотов из разных объектов вполне достаточно класс QSignalMapper используется для удобства чтобы в один слот сразу передать в строковых значений QString. Очень важно понять что в методе connect() мы не передаем значения напрямую, а просто указываем типы посредством, которых будет осуществляться передача данных. Если бы нам нужно было передавать разные значения в один и тот же слот, то они должны были бы доставляться сигналами и это сделало реализацию более громоздкой, например, могло бы понадобится унаследовать классы QPushButton, только для того, чтобы определить свои собственные сигналы, высылающие нужные значения. В случае с QSignalMapper мы можем “напрямую” передать в один и тот же слот различные значения. Надеюсь немного прояснил.

  4. На странице 42

    Из сказанного становится ясно, что не имеет смысла определять сигналы как protected
    private, или puЫic, поскольку они играют роль вызывающих методов.

    Но тут есть тонкость. В Qt 4 сигналы были реализованы через privat, а в Qt 5 поправили и теперь они реализованы через public, что позволяет делать вызов emit obj->method(), а это упращает написание тестов.

    1. Спасибо Сергей за ценное дополнение, думаю, что кому-то оно может действительно пригодиться.

  5. Здравствуйте, почему то программа-счетчик, приведенная в листингах 2.8-2.10 не закрывается при достижении счётчика значения 5, счётчик просто увеличивается дальше. В чем причина?

    1. Андрей, я проверил, у меня окно закрывается сразу при достижении значения 5. Может быть Вы внесли изменения в код программы?

  6. Здравствуйте, в разделе “соединение объектов”, приводится пример альтернативного метода соединения сигналов и слотов со следующей сигнатурой:
    QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection),
    далее приводится пример использования:
    QObject::connect(pSender, &SenderClass::signalMethod, pReceiver, &ReceiverClass::slotMethod);
    Но в данном примере используются указатели на методы, на не объекты класса QMetaMethod?

    1. Здравствуйте Руслан! Альтернативный метод предполагает использование следующей сигнатуры:
      QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)

  7. Здравствуйте, Макс! Хотел прояснить такой момент. В данной главе Вы указали, что “все объекты класса QObject или унаследованных от него классов должны создаваться динамически оператором new…”, но в листинге 2.8 объекты классов QLabel, QPushButton и Counter создаются не динамически. Поясните, пожалуйста. Спасибо!

    P.S.: На странице 52 имеется небольшая опечатка, где написано: “Метод children() возвращает константный указатель на список объектов-потомков. Для приведенного ранее примера (см. листинг 2.11 и рис. 2.2)…”, имеется ввиду листинг 2.12, а не 2.11.

    1. Здравствуйте, Вячеслав!
      В листинге 2.8 показана основная функция программы main(). Созданные в этой функции объекты уничтожаются только в конце работы всей программы, именно поэтому можно их создавать не динамически. На счет листинга, спасибо. Это опечатка, должно быть 2.12 вместо 2.11.

  8. Добрый день. В разделе “Соединение объектов” приводится два варианта реализации соединения::
    QObject::connect(&cmd_1, SIGNAL(clicked()), &counter, SLOT(slotInc()));
    //альтернативны вариант
    QObject::connect(&cmd_2, &QPushButton::clicked, &counter, &Counter::slotInc);

    Как по мне, но альтернативный вариант позволяет выбирать метод сигнала и слота в появляющемся ниспадающем списке после ввода Class:: и это удобно.
    Помимо того что ошибки будут выявлены на этапе компиляции, хотелось бы так же узнать о других плюсах и минусах альтернативного способа. Что на счет скорости срабатывания, количество кода, времени компиляции при альтернативном методе ?

    1. В качестве минуса алтернативного варрианта, можно упомянуть снижение читаемости кода программы, потому что видно только соединение сигнала со слотом, но информация о аргументах и их типе в строчке кода отсутствует.

  9. В разделе “Резюме” второй главы:
    “QObject – класс, по сути являющийся основным классом при программировании с использованием Qt. Конструктор класса QObject имеет два параметра, первый используется для создания объектных иерархий, а второй – для присвоения объекту имени.”

    Я не нашел такого конструктора ни в подсказках QtCreator, ни на сайте официальной документации.

    1. Да, Штефан это так, у конструктора QObject только один параметр QObject(QObject *parent = nullptr)

  10. Здраствуйте,

    На странице 50 при запрашивании места на Heap’е в строке:
    QSignalMapper* psigMapper = new QSignalMapper(this);

    в конце, в скобках передача указателя на собственный объект, – это элемент диалекта c++ 11 ? и для чего это делается?
    спасибо

    1. Здравствуйте, Алекс! QSignalMapper унаследовал от QObject. В конце передается указатель на объект предка, это нужно для того чтобы сформировать объектную иерархию. В данном случае это необходимо чтобы предок позаботился об уничтожении объекта QSignalMapper. Это поможет избежать проблемы с утечкой памяти. Более подробно об создании объектных иерархий можно прочитать в главе 2, раздел “Создание объектных иерархий”

Leave a Reply

Your email address will not be published.

Please reload

Please Wait