Как получить ширину оконной рамы, прежде чем создавать какие-либо окна? - PullRequest
6 голосов
/ 14 сентября 2011

EDIT: это приложение будет работать на Windows, Mac и различных дистрибутивах Linux. Я знаю, что у Linux проблемы с этим, но как насчет Windows? Mac

Есть ли способ получить ширину рамки для обычного окна, ДО показа каких-либо окон? После показа окна я знаю, что могу вычесть size() из frameSize(), но это не будет работать, пока не появится окно.

Я посмотрел на QApplication::style()->pixelMetric(), и я могу получить высоту строки заголовка, используя

QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight)

но я не вижу никаких вариантов, чтобы получить ширину остальной границы вокруг окна.

Единственное решение, которое я нашел до сих пор, это:

  • установить непрозрачность окна на 0 (чтобы пользователь ее не видел),
  • показать окно
  • затем вычтите size() из frameSize()

Есть ли лучший способ?

Ответы [ 2 ]

6 голосов
/ 17 декабря 2012

Я разместил предлагаемое решение в другом вопросе в StackOverflow, но я также опубликую его здесь.Вы можете переместить окно куда-нибудь далеко за пределы экрана, прежде чем показывать его, а затем запросить его геометрию и, наконец, переместить его туда, куда вам нужно (если для этого вам нужна геометрия).Например, чтобы центрировать главное окно на основном экране без мерцания, я делаю следующее:

MainWindow mainWindow;
QRect primaryScreenGeometry(QApplication::desktop()->screenGeometry());
mainWindow.move(-50000,-50000);
mainWindow.show();
mainWindow.move((primaryScreenGeometry.width() - mainWindow.width()) / 2.0,
                (primaryScreenGeometry.height() - mainWindow.height()) / 2.0);

Я тестировал этот код только на Windows XP и Qt 4.8.x.Надеюсь, это работает и на других платформах.

3 голосов
/ 18 сентября 2011

Если вы этого не видели, страница Qt doc Виджеты окон и диалогов содержат много информации об этом.

Вы не говорите, на какой платформе вы работаете, но это X11, ответ кажется «Нет», лучшего способа нет:

X11 Особенности

В X11 у окна нет рамки, пока оконный менеджер не украсит ее. Это происходит асинхронно в некоторый момент времени после вызова QWidget :: show () и первого события рисования, которое получает окно, или не происходит вообще. Имейте в виду, что X11 не имеет политики (другие называют его гибким). Таким образом, вы не можете делать какие-либо безопасные предположения о декоративной раме, которую получит ваше окно. Основное правило: всегда есть один пользователь, который использует оконный менеджер, который нарушает ваши предположения и который будет жаловаться вам.

(мне нравится ваш обходной путь установки непрозрачности на 0: аккуратно!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...