Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |
QWidget предоставляет несколько функций, работающих с геометрией виджета. Некоторые из этих функций работают с чистой клиентской областью (т.е. с окном за исключением оконной рамки), другие учитывают оконную рамку. Дифференцирование сделано способом, делающим прозрачным наиболее частое использование.
Обратите внимание, что различие имеет значение только для декоративных виджетов верхнего уровня. Для всех дочерних виджетов геометрия рамки эквивалентен геометрии клиентской области виджета.
Данная диаграмма иллюстрирует использование большинства функций:
Topics:
В X11 окно не имеет рамки пока оконный менеджер не отобразит его. Это происходит асинхронно в некоторый момент после вызова QWidget::show() и первого отображения, когда окно получает сообщение о рисовании или этого не происходит совсем. Имейте в виду, что X11 не имеет предопределенной политики (некоторые называют это гибкостью). Таким образом, Вы не можете делать никаких безопасных предположений о том, какое оформление примет Ваше окно. Основное правило: Всегда есть один пользователь который будет использовать оконный менеджер, который нарушит развеет Ваши предположения, и который будет Вам жаловаться.
Кроме того, инструментарий не может размещать окна на экране. Все, что может сделать Qt, это послать некоторые предпочтения оконному менеджеру. Оконный менеджер, отдельный процесс, может учесть эти предпочтения, игнорировать, или неправильно истолковать их. Из-за местами неясного Руководства по Взаимодействия с Клиентом (Inter-Client Communication Conventions Manual (ICCCM)), обработка размещения окон в существующих оконных менеджерах выполняется по разному.
X11 не предоставляет стандартного и легкого способа выяснения геометрии рамки как только оно оформлено. Qt решает эту проблему с помощью тонкой эвристики и умного кода, работающего на широком диапазоне существующих сегодня оконных менеджеров. Не стоит удивляться, если обнаружите, что QWidget::frameGeometry() возвращает неверное значение.
Кроме того, X11 не предоставляет сопсоба максимизировать окно. QWidget::showMaximized() должно учитывать эту особенность. Его результат зависит от результата QWidget::frameGeometry() и способности оконного менеджера разместить окно надлежащим образом. Ничего из этого нельзя гарантировать.
Общей задачей современных приложений состоит в восстановлении геометрии окна в следующей сессии. В Windows решение данной задачи состоит в сохрании QWidget::geometry() и вызове QWidget::setGeometry() в следующей сессии перед вызовом show(). В X11 это не будет работать, так как неотображенное окно не имеет рамки. Оконный менеджер оформит окно позже. Когда это происходит, окно сдвигается к правому-нижнему углу экрана в зависимости от оформляющей рамки. Хотя X и предоставляет способ избежать этого перемещения, наши испытания показали, что почти все оконные менеджеры не в состоянии реализовать данную возможность.
Нужно вызвать setGeometry() после show(). Это имеет два неудобства: на миллисекунды виджет отображается в неправльном положении (в результате эффект мерцания) и что в настоящий момент только каждый второй оконный менеджер может сделать это правильно. Более безопасное решение состоит в сохранении pos() и size() и восстановлении геометрии с помощью QWidget::resize() и move() перед вызовом show(), как показано в следующих фрагментах кода (из примера Application):
void MainWindow::readSettings() { QSettings settings("Trolltech", "Application Example"); QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); QSize size = settings.value("size", QSize(400, 400)).toSize(); resize(size); move(pos); } void MainWindow::writeSettings() { QSettings settings("Trolltech", "Application Example"); settings.setValue("pos", pos()); settings.setValue("size", size()); }
Данный способ работает и на Microsoft Windows, и на наиболее распространенных оконных менеджерах X11.
Copyright © 2005 Trolltech | Trademarks | Qt 4.1.0 |