Russian Qt Forum
Ноябрь 28, 2024, 20:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMenu geometry  (Прочитано 5247 раз)
andrew.k
Гость
« : Январь 11, 2012, 00:35 »

Как заставить QMenu обновить свою геометрию до того, как меню будет показано?

Все, что я пробовал не сработало.
Пока что написал такой фикс. Возможно есть другие варианты?

Код
C++ (Qt)
       QMenu *m = dynamic_cast<QMenu *>(w);
       if(m)
       {
           int width = 0, height = 0;
           QList<QAction *> list = m->actions();
           for(int i = 0, count = list.count(); i < count; ++i)
           {
               QRect r = m->actionGeometry(list[i]);
               if(width < r.width())
                   width = r.width();
               height += r.height();
           }
           m->resize(width,height);

Записан
andrew.k
Гость
« Ответ #1 : Январь 11, 2012, 00:43 »

Кстати, этот метод вычисляет геометрию некорректно. Но пока сойдет.
Записан
andrew.k
Гость
« Ответ #2 : Январь 11, 2012, 02:26 »

вычисляет корректно, просто стили подгружались после вычиления размеров в конструкторе.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Январь 11, 2012, 07:24 »

А что, adjustSize() не помог?
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #4 : Январь 11, 2012, 08:23 »

А что, adjustSize() не помог?
Нет. Он почему-то растягивает меню до размера формы.
Отображается корректно, но до показа размеры гигантские.
Записан
andrew.k
Гость
« Ответ #5 : Январь 11, 2012, 13:17 »

неужели никто?
Меню находится внутри графической сцены.
Во вложении скрин проблемы.
Справа это уже край окошка, а не скриншот обрезанный.
Записан
BRE
Гость
« Ответ #6 : Январь 11, 2012, 13:18 »

Можно попробовать еще с sizeHint() поиграться.
Записан
andrew.k
Гость
« Ответ #7 : Январь 11, 2012, 13:20 »

Можно попробовать еще с sizeHint() поиграться.
Пробовал, он возвращает абстрактные значения, похожие но не соответствующие действительности.
Записан
BRE
Гость
« Ответ #8 : Январь 11, 2012, 13:33 »

Попробуй перехватывать resizeEvent и корректировать положение там.
Записан
andrew.k
Гость
« Ответ #9 : Январь 11, 2012, 13:53 »

Попробуй перехватывать resizeEvent и корректировать положение там.

Чем это будет лучше текущего решения?
Сейчас я это делаю перед вызовом popup().
И код отрабатывает однократно. Т.е. только первый показ меню.
Записан
BRE
Гость
« Ответ #10 : Январь 11, 2012, 16:10 »

Чем это будет лучше текущего решения?

Кстати, этот метод вычисляет геометрию некорректно. Но пока сойдет.

Будешь получать корректную геометрию.
Я думал в этом был смысл треда.
Записан
andrew.k
Гость
« Ответ #11 : Январь 11, 2012, 16:44 »

Так я ж привел код. Он корректную вычисляет. Просто сначала забыл про стили и решил, что не правильно. Оказалось все верно.
Просто странно, что нет нормального способа заставить его обновить геометрию до показа.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.191 секунд. Запросов: 23.