![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Думал все будет легко, алгоритм ясен. Но не получается, Trolltech предупредили, что вызывать setGeometry внутри moveEvent, resizeEvent нельзя, т.к. будет бесконечная рекурсия. Ну конец то у нее есть - краш, это я уже выяснил.
Но дело в том, что я поставил специальные проверки, чтобы избежать подобной рекурсии. По логике, если граница правой рамки окна входит в 5 пиксельную зону (у меня 20 для удобства) перед правой границей робочего стола, то мы просто из ширины экрана вычитаем размер нашего окна и это и будет новая позиция X. Поэтому, если координата X границы правого окна программы равна ширине экрана, то значит программа уже на своей месте и setGeometry не требуется. Интересность еще в том, что для нижней границы окна, когда идет рассчет по Y - все работает. Ну за исключением бага с возможностью изменить ширину окна потащив за верхнюю границу заголовка окна. Тут тогда и координаты окна меняются и высота его меняется, в итоге это приводит к тому, что увеличить высоту окна можно, а вот уменьшить уже нет. Ну думаю ладно, если вычисления по Y работают, то почему по X не пашут. Вот код для приклеивания окна к правому краю:
А это то, что я вижу в логе:
Отсюда видно, что изначально в setGeometry передается правильно. Но при следующем входе в moveEvent видно, что координаты искажены, хрен бы с иксом, так вот как меняется Y я ума не приложу. Сам я его нигде не вычитаю и шаг какой-то странный - 23. Dwidth и Dheith - ширина/высота рабочего стола. |
||||
|
|||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
SABROG,
Попробуй вместо setGeometry(...) вызвать move(_x, _y), у меня так работает, правда в KDE ![]() А вообще можно реимплементировать QWidget::event() и делать там всё как QWidget, но позицию изменять заранее как надо, тогда оно будет лучше работать, потому что окно сразу передвинется куда нужно, а не будет прыгать как сейчас. -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Спасибо, действительно move() отрабатывает нормально. Вопрос решен.
Реализовал так, учитывая все известные баги это оптимальный вариант:
Это сообщение отредактировал(а) SABROG - 19.8.2007, 11:47 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |