Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: OS2 от Октябрь 26, 2008, 00:10



Название: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 26, 2008, 00:10
Всем доброго времени суток!
Подскажите новичку, как узнать высоту строки меню, созданного при помощи QMenu?


Название: Re: Как узнать высоту строки меню?
Отправлено: Karl-Philipp от Октябрь 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.


Название: Re: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 26, 2008, 13:01
height () я попробовал в первую очередь, но она не возвращает правильную высоту строки меню. Эксперементальным методом было установленно, что у меня выстоа меню, созданного через QMenu  = 20 пикселям, height() - вернула 30.
В чем проблема, что я не так деляю?


Название: Re: Как узнать высоту строки меню?
Отправлено: Karl-Philipp от Октябрь 26, 2008, 16:21
взял первый попавшийся пример с интерфейсом из qt. Посмотрел в дизайнере высоту меню - 21.
проверил из программы:
Код:
qDebug("menu height is %d", menubar->height());
результат - 21

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

а что это за эксперементальный путь?


Название: Re: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 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
???
Цитировать
а что это за эксперементальный путь?
В фотошопе линейкой померил...  ;D


Название: Re: Как узнать высоту строки меню?
Отправлено: ритт от Октябрь 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


Название: Re: Как узнать высоту строки меню?
Отправлено: lit-uriy от Октябрь 26, 2008, 20:47
2 OS2, таких эксперементаторов троли тоже тоже предвидели и сделали инструмент %QTDIR%/pixeltool.exe
он позволяет как увеличительным стеклом разглядывать окошки и умеет мерить растояния между пикселями. ;)


Название: Re: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 26, 2008, 21:09
Спасибо, все работает!  ;D

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


Название: Re: Как узнать высоту строки меню?
Отправлено: ритт от Октябрь 26, 2008, 21:14
а почитать о том, что удаляешь - не?
ну, работает - и работает...разбирайся...


Название: Re: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 26, 2008, 21:35
Постепенно во всем разберусь, пока на это времени нет....


Название: Re: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 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);

ЗЫ: еще раз большое спасибо Константину за помощ.


Название: Re: Как узнать высоту строки меню?
Отправлено: ритт от Октябрь 27, 2008, 13:26
нет, недостаточно.
во-первых, не учитываются размеры иконки, если таковая имеется;
во-вторых, стайлопшион необходимо инициализировать значениями соотв.виджета.


Название: Re: Как узнать высоту строки меню?
Отправлено: OS2 от Октябрь 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();
}


Название: Re: Как узнать высоту строки меню?
Отправлено: ритт от Июль 17, 2009, 13:27
ыыы...такая же задача - и первое, что нашёл по поиску - мой же ответ :)


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

есть идеи?