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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать высоту строки меню?  (Прочитано 9200 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Октябрь 26, 2008, 00:10 »

Всем доброго времени суток!
Подскажите новичку, как узнать высоту строки меню, созданного при помощи QMenu?
Записан
Karl-Philipp
Гость
« Ответ #1 : Октябрь 26, 2008, 08:33 »

Цитировать
height : const int
This property holds the height of the widget excluding any window frame.
See the Window Geometry documentation for an overview of window geometry.
Access functions:
int height () const
See also geometry, width, and size.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #2 : Октябрь 26, 2008, 13:01 »

height () я попробовал в первую очередь, но она не возвращает правильную высоту строки меню. Эксперементальным методом было установленно, что у меня выстоа меню, созданного через QMenu  = 20 пикселям, height() - вернула 30.
В чем проблема, что я не так деляю?
Записан
Karl-Philipp
Гость
« Ответ #3 : Октябрь 26, 2008, 16:21 »

взял первый попавшийся пример с интерфейсом из qt. Посмотрел в дизайнере высоту меню - 21.
проверил из программы:
Код:
qDebug("menu height is %d", menubar->height());
результат - 21

... Эксперементальным методом было установленно, что у меня выстоа меню, созданного через QMenu  = 20 пикселям, height() - вернула 30.
В чем проблема, что я не так деляю?

а что это за эксперементальный путь?
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #4 : Октябрь 26, 2008, 17:56 »

Да я все понимаю, что работать то должно, вот только почему не работает?...
Вот так я создаю менюшку (для краткости приведу только часть кода):
Код:
	m_pAboutQt = new QAction( tr("&About Qt"), this );
m_pAboutQt->setIcon( QIcon(":/RES/copy.png") );
m_pAboutQt->setShortcut( tr("Ctrl+Q") );
m_pAboutQt->setStatusTip( tr("About Qt...") );
connect( m_pAboutQt, SIGNAL(triggered()), this, SLOT(About()) );

m_pMainMenu = menuBar()->addMenu( tr("&File") );
m_pMainMenu->addAction(m_pAboutAction);
m_pMainMenu->addAction(m_pAboutQt);

             iMenuH = m_pMainMenu->height(); //Здесь я пытаюсь получить его высоту, возвращает - 30
Непонимающий
Цитировать
а что это за эксперементальный путь?
В фотошопе линейкой померил...  Смеющийся
Записан
ритт
Гость
« Ответ #5 : Октябрь 26, 2008, 19:38 »

высота строки QMenu будет зависеть от QAction этой строки.
если опустить некоторые детали, код должен быть примерно следующим:
Код:
        QMenu *menu = m_pMainMenu; // меню, в котором ищем высоту строки (акшена)

    const int hmargin = menu->style()->pixelMetric(QStyle::PM_MenuHMargin, 0, menu),
              vmargin = menu->style()->pixelMetric(QStyle::PM_MenuVMargin, 0, menu),
              icone = menu->style()->pixelMetric(QStyle::PM_SmallIconSize, 0, menu);

        QAction *action = m_pAboutQt; // акшен, для которого ищем высоту

        QFontMetrics fm(action->font().resolve(menu->font()));
        QFontMetrics qfm = menu->fontMetrics();

        QStyleOptionMenuItem opt;
        menu->initStyleOption(&opt, action);
        opt.rect = menu->rect();

        QSize sz;
        if (action->isSeparator()) {
            sz = QSize(2, 2);
        } else {
            sz.setHeight(qMax(fm.height(), qfm.height()));

            QIcon is = action->icon();
            if (!is.isNull()) {
                QSize is_sz = QSize(icone, icone);
                if (is_sz.height() > sz.height())
                    sz.setHeight(is_sz.height());
            }
        }
        sz = menu->style()->sizeFromContents(QStyle::CT_MenuItem, &opt, sz, q);

собственно, этим можно ограничиться, а можно добавить ещё проверку на QWidgetAction и взятие размеров виджета...
советую почитать исходники qmenu.cpp
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Октябрь 26, 2008, 20:47 »

2 OS2, таких эксперементаторов троли тоже тоже предвидели и сделали инструмент %QTDIR%/pixeltool.exe
он позволяет как увеличительным стеклом разглядывать окошки и умеет мерить растояния между пикселями. Подмигивающий
Записан

Юра.
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #7 : Октябрь 26, 2008, 21:09 »

Спасибо, все работает!  Смеющийся

ЗЫ: вот только строку:
Код:
menu->initStyleOption(&opt, action);
пришлось удалить, при сборке ВС ругалась на:
Цитировать
error C2248: 'QMenu::initStyleOption' : cannot access protected member declared in class 'QMenu'
Записан
ритт
Гость
« Ответ #8 : Октябрь 26, 2008, 21:14 »

а почитать о том, что удаляешь - не?
ну, работает - и работает...разбирайся...
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #9 : Октябрь 26, 2008, 21:35 »

Постепенно во всем разберусь, пока на это времени нет....
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #10 : Октябрь 27, 2008, 12:23 »

Для получения высоты строки меню, вполне достаточно этого:
Код:
	QSize size;
QStyleOptionMenuItem opt;
QMenu *menu = m_pMainMenu;

QFontMetrics fm( m_pMainMenu->font().resolve(menu->font()) );
QFontMetrics qfm = menu->fontMetrics();

opt.rect = menu->rect();

size.setHeight( qMax(fm.height(), qfm.height()) );

size = menu->style()->sizeFromContents(QStyle::CT_MenuItem, &opt, size, this);

ЗЫ: еще раз большое спасибо Константину за помощ.
Записан
ритт
Гость
« Ответ #11 : Октябрь 27, 2008, 13:26 »

нет, недостаточно.
во-первых, не учитываются размеры иконки, если таковая имеется;
во-вторых, стайлопшион необходимо инициализировать значениями соотв.виджета.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #12 : Октябрь 27, 2008, 13:51 »

Иконки нет.
Инициализируем так(?):
Код:
int MainWindow::GetMenuHieght()
{
QSize size;
QStyleOptionMenuItem opt;
QMenu *menu = m_pMainMenu;

QFontMetrics fm( m_pMainMenu->font().resolve(menu->font()) );
QFontMetrics qfm = menu->fontMetrics();

opt.initFrom( menu );
opt.rect = menu->rect();

size.setHeight( qMax(fm.height(), qfm.height()) );
size = menu->style()->sizeFromContents(QStyle::CT_MenuItem, &opt, size, this);

return size.height();
}
Записан
ритт
Гость
« Ответ #13 : Июль 17, 2009, 13:27 »

ыыы...такая же задача - и первое, что нашёл по поиску - мой же ответ Улыбающийся
Записан
ритт
Гость
« Ответ #14 : Июль 19, 2009, 15:32 »

мля, чё-т я в ступоре...
требуется *задать* высоту конкретного менюайтема. бегло пошерстив сорцы нашёл установку размеров при пересчёте геометрии - если action является widgetAction'ом. НО затем связанному виджету снова устанавливаются левый размер и айтем в итоге имеет ту же высоту, что и его соседи ((

есть идеи?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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