Как узнать положение панели системы трея в Qt?

#c #qt

#c #qt

Вопрос:

Я разрабатываю кроссплатформенное приложение и хочу отобразить QDialog в зависимости от того, где закреплен systemtray. В Windows есть только один лоток, но его можно прикрепить к любой стороне экрана. В Ubuntu у вас есть верхняя панель меню, а затем панель запуска. Есть ли способ получить положение этой панели (и лаунчера в Ubuntu Unity) с помощью Qt?

Ответ №1:

Есть ли кроссплатформенный способ получить положение «панели задач» (например, Launcher в Ubuntu Unity) с помощью Qt?

Из-за разных платформенных API мы можем полагаться только на Qt, и я бы попытался найти разницу между всей геометрией «экрана» и «доступной». Доступная геометрия — это, по сути, весь экран за вычетом прямоугольника системной панели задач. Обратите внимание на систему multimonitor и укажите положение виджета для получения правильной полной и доступной геометрии монитора.

http://doc.qt.io/qt-5/qdesktopwidget.html

 QRect entireRect =
   QApplication::desktop()->screenGeometry(pMyAppWidget);

QRect availRect =
   QApplication::desktop()->availableGeometry(pMyAppWidget);
  

Где availRect должно быть подмножество entireRect . Затем вам нужно выяснить, какая область entireRect не находится внутри availRect , и это не сложно.

Просто предлагаю один простой способ найти «вычитаемый» прямоугольник:

 QRegion availRgn(availRect);
QRegion entireRgn(entireRect);
auto rects = entireRgn.subtracted(availRgn).rects();
if (rects.size() > 0) {
   // there is a task bar rectangle found
   QRect taskBarRect = rects[0];
}