Мы могли бы передать window в конструкторах QSpinBox и QSlider, указывая на то, что window должен быть их роди­тельским виджетом, но здесь это делать необязательно, поскольку система компо­новки определит это самостоятельно и автоматически установит родительский вид­жет для наборного счетчика и ползунка, как мы это увидим вскоре.

Два вызова функции QObject:: connect (), выполненные в строках с 14 по 17, обес­печивают синхронизацию работы наборного счетчика и ползунка, заставляя их всег­да показывать одинаковое значение. Если один из виджетов изменяет значение, то генерируется сигнал valueChanged(int) и вызывается слот setValue(int) другого вид-жета с новым значением возраста.

В строке 18 наборный счетчик устанавливается в значение 35. В результате вид­жет QSpinBox генерирует сигнал valueChanged(int) с целочисленным аргументом 35. Этот аргумент передается слоту setValue(int) виджета Qslider, и в результате пол­зунок устанавливается в значение 35. Ползунок затем также генерирует сигнал valueChanged(int), поскольку его значение изменилось, и вызывает слот setVal-ue(int) наборного счетчика. Но на этот раз функция setValue(int) не будет генери­ровать сигнал, поскольку наборный счетчик уже имеет значение 35. Это не позволя­ет повторять эти действия бесконечно. Описанная ситуация продемонстрирована на рис. 1.5.

В строках с 19 по 22 мы размещаем виджеты наборного счетчика и ползунка, ис­пользуя менеджер компоновки. Менеджер компоновки - это объект, который уста­навливает размер и положение виджетов, которые располагаются в зоне его дейст­вия. Qt имеет три основных класса менеджеров компоновки:

• QHBoxLayout размещает виджеты по горизонтали слева направо (или справа нале­во, в зависимости от культурных традиций);

• QVBoxLayout размещает виджеты по вертикали сверху вниз;

• QG rid Layout размещает виджеты в ячейках сетки.

Выполненный в строке 22 вызов QWidget::setLayout() устанавливает менеджер компоновки для окна. За кулисами создаются дочерние связи QSpinBox и QSlider с виджетом, для которого установлен менеджер компоновки, и по этой причине нам не требуется в явной форме задавать родительский виджет при конструировании вид­жета, размещаемого в зоне действия менеджера компоновки.


Рис. 1.5. Изменение значения в одном из виджетов приводит к изменению значения в другом виджете


<< назад вперед >>