Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрыть или удалить элемент QMenu
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
mor
Поиском пользовался не нашел, гуглил, тот же результат, как такое сделать?
Litkevich Yuriy
методы hide() и show() применимы ко всем виджетам, пробывал?
DEADHUNT
visible = false, но меню всеровно показывается. есть ещё какие нибудь варианты?
Nicolay Sidorov
->setVisible(false)
->setHidden(true)
->hide()
- ничего из этого не работает для QMenu.
Остается использовать только setEnabled(false) или setDisabled(true), на большее, видимо, рассчитывать смысла нет.

:clapping: :clapping: :clapping:
Способ скрытия QMenu найден:

Надо только подсчитать порядковый номер нужного элемента QMenu (среди всех остальных, находящихся в menuBar'e):

//QMenuBar* menuBar;

menuBar->actions()[#]->setVisible(false);

// где # - номер нужного элемента
Litkevich Yuriy
Цитата(Nicolay Sidorov @ 23.7.2009, 23:45) *
Надо только подсчитать порядковый номер нужного элемента QMenu
а зачем считать? тебе должен быть известен указатель на действие (QAction).
SABROG
Или найти по имени объекта:

void hideMenuItem(const QString &name)
{
    QList <QAction *> actions = menuBar->actions();
    foreach (QAction *action, actions) {
        if (action->objectName() == name)) {
            action->setVisible(false);
            break;
        }
    }
}
kwisp
QAction наследник QObject так что можно и стандартные функции юзать, кстати оч удобно так ка можно регулярные выражения использовать.
QList<T> QObject::findChildren ( const QString & name = QString() ) const
QList<T> QObject::findChildren ( const QRegExp & regExp ) const
SABROG
Цитата(kwisp @ 24.7.2009, 9:08) *
QAction наследник QObject так что можно и стандартные функции юзать, кстати оч удобно так ка можно регулярные выражения использовать.
QList<T> QObject::findChildren ( const QString & name = QString() ) const
QList<T> QObject::findChildren ( const QRegExp & regExp ) const


Тут то ты и попался в ловушку ;) При добавлении QAction к виджету, он не становится его хозяином:

Цитата
The ownership of action is not transferred to this QWidget.
kwisp
SABROG,
а у меня хозяин и все работает.:)
правда у меня action`Ы добавляются в один тулбар.

ты привел цитату из функции addWidget.
а если посомотреть на конструкторы QAction там есть QObject* parent.
если знаешь кого сделал хозяином всех действий думаю можно ими рулить.
SABROG
Цитата(kwisp @ 24.7.2009, 9:21) *
ты привел цитату из функции addWidget.


void QWidget::addAction ( QAction * action )

parent может быть нулем или его родителем может быть QActionGroup, или экшен может быть использован в нескольких местах.
kwisp
Цитата(SABROG @ 24.7.2009, 9:25) *
parent может быть нулем или его родителем может быть QActionGroup,

конечно может(сам только потом его удаляй и всё) использование приведенных мною функций предполагает целенаправленное использование хозяина. Кому надо найти нужный action? программисту. так вот ему можно рулить action через заранее назначенного специально хозяина. QActionGroup тоже наследник QObject вроде бы проблем нет.
Цитата(SABROG @ 24.7.2009, 9:25) *
или экшен может быть использован в нескольких местах.

использование action в нескольких местах не помешает управлению через хозяина.
это как вариант или предложение, я на своем решении не настаиваю.

просто утверждаю что функции которые я привел вполне применимы к QAction как в прочем и к другим наследникам QObject.
SABROG
Цитата(kwisp @ 24.7.2009, 9:33) *
QActionGroup тоже наследник QObject вроде бы проблем нет.


Но он никак не будет связан с меню или виджетом. А его родителем будет, скорее всего, класс главной формы.

Цитата
использование приведенных мною функций предполагает целенаправленное использование хозяина


Если рассматривать ситуацию с "черной" коробкой внутри которой находятся не известные родители и не известные экшены (видимо именно такая ситуация у автора темы), то варианты предложенные тобой и Юрием не применимы. Иначе, лучше воспользоваться обычным указателем на QAction, если ты его создаешь и можешь контролировать какого родителя передавать, то зачем городить огород?
kwisp
Цитата(SABROG @ 24.7.2009, 10:13) *
с "черной" коробкой

дык, так рассуждать то функции findChildren пустая трата времени троллей.

а что там у автора имеет место быть это уже конкретика автора если он не знает хозяина action откуда он знает имя?

я считаю что если ты пишешь программу то зачем там городить "черные" ящики, в смысле того что не знаешь кому какого хазяина назначил. и расуждать об объекте типа о нем ничего не известно не практично.
не буду рассказывать и давать ссылки о том что -- отношения parent - child в Qt очень мощная штука и на ней многое построено.

Цитата(SABROG @ 24.7.2009, 10:13) *
с "черной" коробкой

так рассуждать то тебе имена действий тогда тоже не известны однако ты как раз по нему ищешь! всё тоже самое что и parent. Что objectName() -- свойство которое может быть нулевой строкой что parent указатель который может быть нулем. в случае черного ящика ты не знаешь ни того ни другого :) а в случае если сам пишешь программу то знаешь и первое и второе и явных причин не пользоваться стандартными библиотечными функциями нет:)

ну да ладно SABROG, о чем спорим то?
каждый сделает как хочет.
спор о пустом.

мир, дружба?
SABROG
Цитата(kwisp @ 24.7.2009, 10:39) *
а что там у автора имеет место быть это уже конкретика автора если он не знает хозяина action откуда он знает имя?

Тоже верно.

Цитата(kwisp @ 24.7.2009, 10:39) *
мир, дружба?


Забавно все это, человек придумал сам для себя проблему и сам же её решил через заднее место.
kwisp
Цитата(SABROG @ 24.7.2009, 11:46) *
Забавно все это, человек придумал сам для себя проблему и сам же её решил через заднее место.

вот об этом по подробнее пожалуйста.
не понял до конца.

что за человек?
что за проблема?
почему через заднее место?

:)
SABROG
Цитата(kwisp @ 24.7.2009, 11:51) *
Цитата(SABROG @ 24.7.2009, 11:46) *
Забавно все это, человек придумал сам для себя проблему и сам же её решил через заднее место.

вот об этом по подробнее пожалуйста.
не понял до конца.

что за человек?
что за проблема?
почему через заднее место?

:)


Автор темы. Видимо не правильно создал структуру приложения, раз приходится получать доступ к нужному QAction'у через задний проход, вместо того, чтобы хранить указатели на нужные экшены.
DEADHUNT
что-то не кто так и не ответил, а правильный ответ:
if (state)
{
    menuBar()->insertMenu(viewMenu->menuAction(), projectMenu);
    menuBar()->insertMenu(viewMenu->menuAction(), buildMenu);
    menuBar()->insertMenu(viewMenu->menuAction(), debugMenu);
}
else
{
    menuBar()->removeAction(projectMenu->menuAction());
    menuBar()->removeAction(buildMenu->menuAction());
    menuBar()->removeAction(debugMenu->menuAction());
}
Гость_Nicolay Sidorov_*
короче, значит скрыть вот так:

//QMenu* menu;
menu->menuAction()->setVisible(false);

и сколько пришлось голову ломать, а ларчик просто открывался. Ну ничего в этом qt по-человечески не делается.
Litkevich Yuriy
Да это место выглядит нелогично, но на первых порах.
Когда приходит понимание того, что в панели меню (QMenuBar) находятся действия (QAction), то всё встаёт на свои места.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.