Глава 6 – Управление автоматическим размещением элементов

Управление автоматическим размещением элементов

10 thoughts on “Глава 6 – Управление автоматическим размещением элементов

    1. Здравствуйте Михаил,
      пожалуйста продолжите свою мысль, Вы имеете ввиду листинг 6.7? Там я опечатки не нашел.

  1. Здравствуйте.
    Листинг 6.7, в определении класса Calculator с помощью #include подключается QWidget, классы QLCDNumber и QPushButton просто объявляются. Но в реализации Calculator.cpp дополнительно подключается модуль QtWidgets, в который входят все вышеизложенные классы. Не логично ли было, подключить QtWidgets в Calculator.h? Или может я не правильно понимаю?

    1. Артем, здравствуйте!
      Чем меньше в заголовочном файле будет директив #include тем лучше, так как большое их количество может повлиять на время компиляции программ, потому что компилятору нужно будет просматривать содержимое каждого из этих фалов.
      Модуль QtWidgets это целая серия #include файлов каждого класса модуля. Поэтому вместо #include или #include используется предварительное объявление класса QLCDNumber в целях облегчения работы C++ компилятора.
      Но все же мы обязаны указать #include и #include так как наш класс Calculator наследуется от класса QWidget, а контейнер QStack используется по значению.
      Надеюсь немного прояснил ситуацию.

  2. Макс добрый день.
    Нашел багу в работе калькулятора.
    Если брать число А + операция + число Б+ операция + число С то к предыдущему результату будет прибавляться строчная сумма всех предыдущих чисел.
    т.е. 5+6+9=80
    потому что 5+6+ (выводит 11) но далее нажимая 9 мы видим 69, нажимаем + или = получаем результат 80, если нажимали + и получив 80 нажмем на 3 то прибавляться к 80 будет 693, и так далее.
    т.е после нажатия кнопки операция, необходимо обнулять m_strDisplay.
    Вот так вот выглядит исправленный участок реализации слота slotButtonClicked:
    if (m_stk.count() >= 2)
    {
    m_stk.push(QString().setNum(m_plcd->value()));
    calculate();
    m_stk.clear();
    m_stk.push(QString().setNum(m_plcd->value()));
    if (str != “=”) m_stk.push(str);
    m_strDisplay = “”; //добавлено обнуление что бы исключить не корректное поведение
    }

    Так же следующего вида присваивание выдает предупреждение:
    qreal fOperand1 = m_stk.pop().toFloat(); //выдает предупреждения т.к. qreal является double
    исправлено так:
    qreal fOperand1 = m_stk.pop().toDouble(); //так предупреждений нет.

  3. Листинг 6.2. Меняю значение параметра функции addStretch, например на 50, но при запуске ничего не меняется. Почему так?

    1. Метод QBoxLayout::addStretch() управляет фактором растяжения между двумя виджетами. Это фактор, а не значение в пикселях (в книге я привожу сравнение с пружиной помещенной между виджетами). То есть задав значение 50 вы просто усилили этот фактор, и до тех пор пока впереди и/или в конце виджетов нет других факторов растяжения, никаких изменений заметно не будет. Попробуйте поставить перед строчкой pcbxLayout->addWidget(pcmdA) еще один фактор растяжения например pcbxLayout->addStretch(50).

  4. Правильно ли я понимаю, что в Qt размещение элементов на форме чаще делают кодом с использованием менеджеров компоновки, а не в визуальном режиме?

    1. Это в зависимости от собственных предпочтений или требований проекта. В Qt можно размещать и создавать виджеты как коде программы, так и визуальном редакторе Qt Designer. Визуальному размещению виджетов посвящена глава 44 “Qt Designer. Быстрая разработка прототипов”

Добавить комментарий для Mikhail Отменить ответ