Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Январь 11, 2012, 00:35



Название: QMenu geometry
Отправлено: 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);



Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 00:43
Кстати, этот метод вычисляет геометрию некорректно. Но пока сойдет.


Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 02:26
вычисляет корректно, просто стили подгружались после вычиления размеров в конструкторе.


Название: Re: QMenu geometry
Отправлено: GreatSnake от Январь 11, 2012, 07:24
А что, adjustSize() не помог?


Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 08:23
А что, adjustSize() не помог?
Нет. Он почему-то растягивает меню до размера формы.
Отображается корректно, но до показа размеры гигантские.


Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 13:17
неужели никто?
Меню находится внутри графической сцены.
Во вложении скрин проблемы.
Справа это уже край окошка, а не скриншот обрезанный.


Название: Re: QMenu geometry
Отправлено: BRE от Январь 11, 2012, 13:18
Можно попробовать еще с sizeHint() поиграться.


Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 13:20
Можно попробовать еще с sizeHint() поиграться.
Пробовал, он возвращает абстрактные значения, похожие но не соответствующие действительности.


Название: Re: QMenu geometry
Отправлено: BRE от Январь 11, 2012, 13:33
Попробуй перехватывать resizeEvent и корректировать положение там.


Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 13:53
Попробуй перехватывать resizeEvent и корректировать положение там.

Чем это будет лучше текущего решения?
Сейчас я это делаю перед вызовом popup().
И код отрабатывает однократно. Т.е. только первый показ меню.


Название: Re: QMenu geometry
Отправлено: BRE от Январь 11, 2012, 16:10
Чем это будет лучше текущего решения?

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

Будешь получать корректную геометрию.
Я думал в этом был смысл треда.


Название: Re: QMenu geometry
Отправлено: andrew.k от Январь 11, 2012, 16:44
Так я ж привел код. Он корректную вычисляет. Просто сначала забыл про стили и решил, что не правильно. Оказалось все верно.
Просто странно, что нет нормального способа заставить его обновить геометрию до показа.