Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kazenniy от Апрель 05, 2012, 14:32



Название: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 14:32
Помогите решить проблему.
Пытаюсь вывести окно рядом с иконкой в трее, как у регулятора громкости. В конструкторе класса создается QSystemTrayIcon, задаются параметры и выводится иконка.
Код:
    m_ptrayIcon = new QSystemTrayIcon(this);
    m_ptrayIcon->setContextMenu(m_ptrayIconMenu);
    m_ptrayIcon->setToolTip("System Tray");

    slotChangeIcon();

    m_ptrayIcon->show();

В классе определен публичный метод
Код:
QRect QEcho::getTrayIconGeometry()
{
    return(m_ptrayIcon->geometry());
}

В main.cpp
Код:
    QEcho w;
    QRect rect;
    rect = w.getTrayIconGeometry();
    rect.setSize(QSize(100,100));
    w.setGeometry(rect);
Окно создается заданного размера, но всегда в левом верхнем углу экрана. Что не так?


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 05, 2012, 14:34
Да не врёт он. Недавно сам пробовал наведение на иконку тестировать.

Видимо ты что-то не так делаешь.

update: Сразу говорю - твоих "огрызков кода" нехватит для помощи тебе ;)


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 14:37
Я понимаю, что не так. Нужно разобраться, что именно не так.
Что нужно кроме "огрызков кода", чтобы разобраться в проблеме?
Может у кого нибудь есть рабочий пример использования QSystemTrayIcon->geometry?


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 05, 2012, 14:42
Выложи минимально компилируемый проект с твоей проблемой. В архиве. В сообщении. И будет тебе счастье.



Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 14:50
Спасибо за совет. Прилагаю архив проекта.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 05, 2012, 15:05
Всё открывается. Всё работает. Плохо конечно, что запоминает положение только один раз при открытии программы. ну да и не учитывает границу экрана.

А так всё ок.

PS красными стрелочками отмечено твоё окошечко.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: LisandreL от Апрель 05, 2012, 15:10
В slotShowHide читайте и устанавливайте положение.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 05, 2012, 15:12
Lisandrel, а тему почитать, не?


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: LisandreL от Апрель 05, 2012, 15:44
Bepec, я читал и даже приложенный пример компилировал, а что вас смутило в моём совете?


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 05, 2012, 15:46
Что к теме он не относится совершенно :/


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 15:47
Всё открывается. Всё работает. Плохо конечно, что запоминает положение только один раз при открытии программы. ну да и не учитывает границу экрана.

А так всё ок.

PS красными стрелочками отмечено твоё окошечко.
Странно. У меня на линуксе окошко всегда в левом верхнем углу появляется. С чем это может быть связано нет идей?


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 15:51
В slotShowHide читайте и устанавливайте положение.
Попробовал, ничего не изменилось.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: LisandreL от Апрель 05, 2012, 15:59
Что к теме он не относится совершенно :/
:o
Я код
Код:
    rect = w.getTrayIconGeometry();
    rect.setSize(QSize(100,100));
    w.setGeometry(rect);
предложил перенести в slotShowHide. Почему это к теме не относится?

kazenniy, тогда смотрите, что вам возвращает m_ptrayIcon->geometry().
Не исключено, что в Linux'е она возвращает неверное значение, например правильные размеры, но координаты всегда нулевые.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 16:22
Размеры правильные отдает, координаты нет.
Нет идей почему так происходит?


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 05, 2012, 16:56
Все чудесатее и чудесатее.
Если запустить в режиме отладки с контрольной точкой на получении геометрии, то она получается правильно и окошко где нужно рисуется.
Ничего не понимаю =(


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 05, 2012, 17:47
Попробуй выводить в дебаг консоль каждый раз при изменении геометрии.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: _OLEGator_ от Апрель 05, 2012, 20:38
у меня в 7 винде нормально позиционируется.
Про линукс могу предположить, что пока не отработает show, в QSystemTrayIcon еще не установлены правильные координаты geometry, надо во время работы смотреть, что возвращает geometry.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Alex Custov от Апрель 05, 2012, 20:55
скорее всего что иконка не успевает встроится в трей, т.к. это происходит асинхронно. Для тестирования создай иконку в трее, и по таймеру через 2 секунды прочитай геометрию и выведи её на консоль.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 06, 2012, 09:15
С таймерами еще не знаком, с QT познакомился неделю назад всего. Буду разбираться.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 06, 2012, 11:22
Похоже действительно не успевает иконку вставить. Поставил задержку 1 сек. перед запросом geometry и все заработало. При этом задержки в 0.5 сек. не хватает.
Занятная разница между платформами получается. =)
Осталось разобраться как по человечески определить готовность иконки, с задержкой делать некузяво.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: LisandreL от Апрель 06, 2012, 13:59
Похоже действительно не успевает иконку вставить. Поставил задержку 1 сек. перед запросом geometry и все заработало. При этом задержки в 0.5 сек. не хватает.
Занятная разница между платформами получается. =)
Осталось разобраться как по человечески определить готовность иконки, с задержкой делать некузяво.
Так вы запрашивайте, как я предлагал, не при создании иконки, а перед показом окна, для которого вы вычисляете положение (к этому месту иконка уже должна быть на своём месте).
Всё равно заранее вычислять 1 раз вычислять геометрию не дело. Иконка могла подвинуться другими иконками, панель могли в другую часть экрана перетащить, да разрешение поменять в конце концов.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 06, 2012, 19:40
Вроде тогда это не помогло. Хотя тогда у меня не было понимания причины, теперь оно вроде есть. Буду пробовать снова.
Спасибо.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: kazenniy от Апрель 07, 2012, 09:19
Как ни странно, в этот раз все получилось. К моменту вызова slotShowHide иконка уже готова и окошко рисуется как нужно. Всем спасибо за участие!
А может ктонить подскажет, как получить информацию о размере и местоположении трея? А то не понятно в какую сторону окошко рисовать.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: Bepec от Апрель 07, 2012, 13:27
QDesktop* позволяет получить размеры экрана, в которые(windows) не включена панель задач.
pos позволяет получить размеры иконки и её положение.
Проводим несложные вычисления + размер окна + в какую сторону открываться и вуаля.


Название: Re: QSystemTrayIcon->geometry врет координаты
Отправлено: LisandreL от Апрель 07, 2012, 15:48
QDesktopWidget
Только не забудьте, что мониторов может быть и несколько.