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