- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания QT 4 программирование GUI на С++ Жасмин Бланшет
Шрифт:
Интервал:
Закладка:
Самый удобный метод компоновки виджетов на форме — использование менеджеров компоновки Qt. Менеджеры компоновки обеспечивают осмысленные, принимаемые по умолчанию значения параметров для каждого типа виджета и учитывают идеальный размер каждого виджета, который, в свою очередь, обычно зависит от шрифта виджета, его стиля и содержимого. Менеджеры компоновки также учитывают максимальные и минимальные размеры и автоматически подстраивают компоновку в ответ на изменения шрифта, изменения содержимого и изменения размеров окна.
Существует три наиболее важных менеджера компоновки: QHBoxLayout, QVBoxLayout и QGridLayout. Эти классы наследуют QLayout, который обеспечивает основной каркас для менеджеров компоновки. Все эти три класса полностью поддерживаются Qt Designer и могут также использоваться непосредственно в программе.
Ниже приводится программный код FindFileDialog, в котором используются менеджеры компоновки:
01 FindFileDialog::FindFileDialog(QWidget *parent)
02 : QDialog(parent)
03 {
04 QGridLayout *leftLayout = new QGridLayout;
05 leftLayout->addWidget(namedLabel, 0, 0);
06 leftLayout->addWidget(namedLineEdit, 0, 1);
07 leftLayout->addWidget(lookInLabel, 1, 0);
08 leftLayout->addWidget(lookInLineEdit, 1, 1);
09 leftLayout->addWidget(subfoldersCheckBox, 2, 0, 1, 2);
10 leftLayout->addWidget(tableWidget, 3, 0, 1, 2);
11 leftLayout->addWidget(messageLabel, 4, 0, 1, 2);
12 QVBoxLayout *rightLayout = new QVBoxLayout;
13 rightLayout->addWidget(findButton);
14 rightLayout->addWidget(stopButtpn);
15 rightLayout->addWidget(closeButton);
16 rightLayout->addStretch();
17 rightLayout->addWidget(helpButton);
18 QHBoxLayout *mainLayout = new QHBoxLayout;
19 mainLayout->addLayout(leftLayout);
20 mainLayout->addLayout(rightLayout);
21 setLayout(mainLayout);
22 setWindowTitle(tr("Find Files or Folders"));
23 }
Компоновка обеспечивается одним менеджером компоновки по горизонтали QHBoxLayout, одним менеджером компоновки в ячейках сетки QGridLayout и одним менеджером компоновки по вертикали QVBoxLayout. Менеджер QGridLayout слева и менеджер QVBoxLayout справа размещаются рядом внутри внешнего менеджера QHBoxLayout. Кромка по периметру диалогового окна и промежуток между дочерними виджетами устанавливаются в значения по умолчанию, которые зависят от текущего стиля виджета; они могут быть изменены, если использовать функции QLayout::setMargin() и QLayout::setSpacing().
Такое же диалоговое окно можно было бы создать с помощью визуальных средства разработки Qt Designer, задавая приблизительное положение дочерним виджетам, выделяя те, которые необходимо расположить рядом, и выбирая пункты меню Form | Lay Out Horizontally, Form | Lay Out Vertically или Form | Lay Out in a Grid. Мы использовали данный подход в главе 2 для создания диалоговых окон Go-to-Cell и Sort приложения Электронная таблица.
Рис. 6.3. Компоновка диалогового окна Find File.
Применение QHBoxLayout и QVBoxLayout достаточно очевидное, однако с QGridLayout дело обстоит несколько сложнее. Менеджер QGridLayout работает с двухмерной сеткой ячеек. Текстовая метка QLabel, расположенная в верхнем левом углу этого менеджера компоновки, имеет координаты (0, 0), a соответствующая строка редактирования QLineEdit имеет координаты (0, 1). Флажок QCheckBox размещается в двух столбцах; он занимает ячейки с координатами (2, 0) и (2, 1). Расположенные под ним объекты QTreeWidget и QLabel также занимают два столбца. Вызовы функции addWidget() имеют следующий формат:
layout->addWidget(виджeт, cтpoкa, cтoлбeц, колСтрок, колСтолбцов);
Здесь виджет является дочерним виджетом, который вставляется в менеджер компоновки, (строка, столбец) — коррдинаты верхней левой ячейки, занимаемой виджетом, колСтрок — количество строк, занимаемое виджетом, и колСтолбцов — количество столбцов, занимаемое виджетом. Если параметры колСтрок и колСтолбцов не заданы, они принимают значение по умолчанию, равное 1.
Вызов addStretch() говорит менеджеру компоновки о необходимости выделения свободного пространства в данной точке. Добавив элемент распорки, мы заставляем менеджер компоновки выделить дополнительное пространство между кнопкой Close и кнопкой Help. B Qt Designer мы можем добиться того же самого эффекта, вставляя распорку. Распорки в Qt Designer отображаются в виде синих «пружинок».
Помимо рассмотренных нами до сих пор случаев использование менеджеров компоновки дает дополнительные выгоды. Если мы добавляем виджет к менеджеру или убираем виджет из него, менеджер компоновки автоматически адаптируется к новой ситуации. То же самое происходит, если мы вызываем hide() или show() для дочернего виджета. Если идеальный размер дочернего виджета изменяется, компоновка автоматически перестраивается, учитывая новый идеальный размер. Кроме того, менеджеры компоновки автоматически устанавливают минимальный размер всей формы на основе минимальных размеров и идеальных размеров дочерних виджетов формы.
В представленных до сих пор примерах мы просто помещали виджеты в менеджеры и использовали распорки для выделения дополнительного пространства. Иногда этого недостаточно для того, чтобы компоновка приняла нужный нам вид. В таких ситуациях мы можем настроить компоновку, изменяя политику размеров и идеальные размеры размещаемых виджетов.
Политика размера виджета говорит системе компоновки, как его следует растягивать или сжимать. Qt обеспечивает разумные, принимаемые по умолчанию значения политик размеров для всех своих встроенных виджетов, но поскольку ни одно принимаемое по умолчанию значение не может учесть всевозможные варианты компоновки, все-таки обычной практикой для разработчиков является изменение политики размеров одного или двух виджетов формы. QSizePolicy имеет как горизонтальный, так и вертикальный компоненты. Ниже приводятся наиболее полезные значения:
• Fixed (фиксированное) означает, что виджет не может увеличиваться или сжиматься. Размер виджета всегда сохраняет значение его идеального размера;
• Minimum означает, что идеальный размер виджета является его минимальным размером. Размер виджета не может стать меньше идеального размера, но он может при необходимости вырасти для заполнения доступного пространства;
• Maximum означает, что идеальный размер виджета является его максимальным размером. Размер виджета может уменьшаться до его минимального идеального размера;
• Preferred (предпочитаемое) означает, что идеальный размервиджета является его предпочитаемым размером, но виджет может при необходимости сжиматься или растягиваться;
• Expanding (расширяемый) означает, что виджет может сжиматься или растягиваться, но впервую очередь он стремится увеличить свои размеры.
На рис. 6.4 приводится иллюстрация смысла различных политик размеров, причем в качестве примера здесь используется текстовая метка QLabel с текстом «Какой-то текст».
На рисунке политики Preferred и Expanding представлены одинаково. Так в чем же их отличие? При изменении размеров формы, содержащей одновременно виджеты с политикой размера Preferred и Expanding, дополнительное пространство отдается виджетам Expanding, а виджеты Preferred по-прежнему будут иметь свой идеальный размер.
Рис. 6.4. Смысл различных политик размеров.
Существует еще две политики размеров: MinimumExpanding и Ignored. Первая была необходима в некоторых редких случаях для старых версий Qt, но теперь она не применяется; предпочтительнее использовать политику Expanding и соответствующим образом переопределить функцию minimumSizeHint(). Последняя напоминает Expanding, но при этом игнорируется идеальный размер виджета и минимальный идеальный его размер.
Кроме горизонтального и вертикального компонентов политики размеров класс QSizePolicy хранит коэффициенты растяжения по горизонтали и вертикали. Эти коэффициенты растяжения могут использоваться для указания того, что различные дочерние виджеты могут растягиваться по-разному при расширении формы. Например, если QTreeWidget располагается над QTextEdit и мы хотим, чтобы QTextEdit был в два раза больше по высоте, чем QTreeWidget, мы можем установить коэффициент растяжения по вертикали для QTextEdit на значение 2, а тот же коэффициент для QTreeWidget — на значение 1.
Другой способ воздействия на компоновку заключается в установке минимального размера, максимального размера или фиксированного размера дочерних виджетов. Менеджер компоновки будет учитывать эти ограничения при компоновке виджетов. Но если этого недостаточно, мы можем всегда создать подкласс дочернего виджета и переопределить функцию sizeHint() для получения необходимого нам идеального размера.