Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Qt 4.3.1 [Прилипание окна как у Winamp] |
Автор: SABROG 18.8.2007, 18:29 | ||||
Думал все будет легко, алгоритм ясен. Но не получается, Trolltech предупредили, что вызывать setGeometry внутри moveEvent, resizeEvent нельзя, т.к. будет бесконечная рекурсия. Ну конец то у нее есть - краш, это я уже выяснил. Но дело в том, что я поставил специальные проверки, чтобы избежать подобной рекурсии. По логике, если граница правой рамки окна входит в 5 пиксельную зону (у меня 20 для удобства) перед правой границей робочего стола, то мы просто из ширины экрана вычитаем размер нашего окна и это и будет новая позиция X. Поэтому, если координата X границы правого окна программы равна ширине экрана, то значит программа уже на своей месте и setGeometry не требуется. Интересность еще в том, что для нижней границы окна, когда идет рассчет по Y - все работает. Ну за исключением бага с возможностью изменить ширину окна потащив за верхнюю границу заголовка окна. Тут тогда и координаты окна меняются и высота его меняется, в итоге это приводит к тому, что увеличить высоту окна можно, а вот уменьшить уже нет. Ну думаю ладно, если вычисления по Y работают, то почему по X не пашут. Вот код для приклеивания окна к правому краю:
А это то, что я вижу в логе:
Отсюда видно, что изначально в setGeometry передается правильно. Но при следующем входе в moveEvent видно, что координаты искажены, хрен бы с иксом, так вот как меняется Y я ума не приложу. Сам я его нигде не вычитаю и шаг какой-то странный - 23. Dwidth и Dheith - ширина/высота рабочего стола. |
Автор: nickless 18.8.2007, 22:39 |
SABROG, Попробуй вместо setGeometry(...) вызвать move(_x, _y), у меня так работает, правда в KDE ![]() А вообще можно реимплементировать QWidget::event() и делать там всё как QWidget, но позицию изменять заранее как надо, тогда оно будет лучше работать, потому что окно сразу передвинется куда нужно, а не будет прыгать как сейчас. |
Автор: SABROG 19.8.2007, 10:12 | ||
Спасибо, действительно move() отрабатывает нормально. Вопрос решен. Реализовал так, учитывая все известные баги это оптимальный вариант:
|