![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
coo_zoo |
![]() ![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 8.3.2010 Пользователь №: 1517 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте,
Итак не много замучился вопросом, как же остановить рекурсию ![]() Идея следующая сохранение пропорций окна при изменении его размеров. mainwindow.h Раскрывающийся текст
main.cpp Раскрывающийся текст
mainwindow.cpp Раскрывающийся текст
Главное окно имеет всего лишь два элемента label и label_2 при изменении размеров окна туда выводятся высота и ширина. Проблема в том что по понятным причинам вызывается рекурсия, которая кстати по непонятным причинам ![]() Прошу помощи и дельного совета как "отсеять" рекурсию? У меня была идея если не нажата левая кнопка мыши значит прекратить. Но в силу своего нубизма не понимаю как это сделать, хотя вроде интуитивно догадываюсь что как-то фильтрами, но мои попытки не увенчались успехом. Буду благодарен за помощь. |
|
|
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
наверное, вот так
Сообщение отредактировал Алексей1153 - 15.10.2012, 8:28 |
|
|
coo_zoo |
![]()
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 8.3.2010 Пользователь №: 1517 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
наверное, вот так Идея очень хороша ![]() но когда попробовал то такое впечатление что это не совсем рекурсия, как будто триггер на срабатывание ивента на ресайз срабатывает после самого ивента, то-есть на момент срабатывания флаг уже в статусе ложь. ЗЫ. Интересное поведение под виндой: на уменьшение размера срабатывает, даже оригинальный код - хорошо, глючит только на увеличение, уменьшает окно к исходному размеру. А под линуксом, в иксах, ещё более интересное: ресайз работает нормально, как на увеличение так и на уменьшение, но иногда сбоит что выражается в некрасивом побликивании ![]() |
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
если в слоте ресайза менять размер, то он сам себя вызывает новым сигналом ресайза. Вероятно, петля разрывается, когда размер устанавливается такой же, какой только что был (при наличии ООС на размер)
в винде WM_WINDOWPOSCHANGED ведёт себя так же (правда тОрмоза в виде установки такого же размера , как мне помнится, нет) Сообщение отредактировал Алексей1153 - 16.10.2012, 14:51 |
|
|
ornelius |
![]()
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 17.10.2012 Пользователь №: 3565 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Проверка if(sizewidth!=oldsizewidth) -- это суть условие выхода из рекурсии. В данном случае проверяется, что ширина окна не изменилась. А должно проверяться, что пропорция окна соответствует требуемой.
Вот этот код всегда выходит из рекурсии:
Первый раз resizeEvent вызывается, когда пользователь изменяет размер, второй раз -- в результате ресайза. Но во второй раз resize уже не вызывается --> рекурсия кончилась. Но такой вариант неправильный -- размер окна меняется после того, как пользователь отпустил мышь. Лучший вариант -- сделать внутренний виджет, для него перегрузить int QWidget::heightForWidth ( int w ) const, потом засунуть в Layout и в главное окно. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 6.5.2025, 21:25 |