Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2017, 00:35   #1
tetta
Пользователь
 
Регистрация: 09.05.2017
Сообщений: 13
По умолчанию QMenu and Button

Можно ли в QMenu(уже созданное меню) добавить кнопку(например QPushButton)?
tetta вне форума Ответить с цитированием
Старый 16.05.2017, 14:17   #2
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

А чем QAction не подходит?
SAMOUCHKA вне форума Ответить с цитированием
Старый 16.05.2017, 14:32   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Не тривиально, вот пример с чекбоксами
Код:
MenuWithCheckBoxes::MenuWithCheckBoxes(QWidget *parent) :
    QMenu (parent),
    is_ignore_hide(false)
{
}

MenuWithCheckBoxes::MenuWithCheckBoxes(const QString &title, QWidget *parent):
    QMenu (title, parent),
    is_ignore_hide(false)
{
}

QAction *MenuWithCheckBoxes::addIgnoredAction(QAction *action)
{
    addAction(action);
    return actionIgnores(action);
}

QAction *MenuWithCheckBoxes::addIgnoredAction(const QString &text)
{
    return actionIgnores(addAction(text));
}

QAction *MenuWithCheckBoxes::addIgnoredAction(const QIcon &icon, const QString &text)
{
    return actionIgnores(addAction(icon, text));
}

void MenuWithCheckBoxes::addCheckbox(const QString &text)
{
    auto r = addIgnoredAction(text);
    r->setCheckable(true);
    connectChange(r);
}

void MenuWithCheckBoxes::addCheckbox(const QIcon &icon, const QString &text)
{
    auto r = addIgnoredAction(icon, text);
    r->setCheckable(true);
    connectChange(r);
}

MenuWithCheckBoxes::states_t MenuWithCheckBoxes::getCurrentStates() const
{
    return states;
}

MenuWithCheckBoxes::states_checked_t MenuWithCheckBoxes::getCheckedCurrentStates() const
{
    states_checked_t  r;
    for (const auto& s : states)
    {
        if (s.second)
            r.insert(s.first);
    }
    return r;
}

void MenuWithCheckBoxes::setVisible(bool visible)
{
    is_ignore_hide = !visible && static_cast<bool>(is_ignore_hide);

    //qDebug()<<"setvisible: "<<visible<<(bool)is_ignore_hide;
    if (is_ignore_hide)
        is_ignore_hide = false;
    else
        QMenu::setVisible (visible);
}

void MenuWithCheckBoxes::mouseReleaseEvent(QMouseEvent *e)
{
    auto action = actionAt(e->pos());
    //qDebug() << "Action found: "<<action;
    if (action)
    {
        // qDebug()<<"Action contains: "<<actions_with_showed_menu.contains (action);
        is_ignore_hide = actions_with_showed_menu.contains (action);
    }
    //qDebug()<<"releaseEvent, "<<(bool)is_ignore_hide;
    QMenu::mouseReleaseEvent (e);
}

QAction *MenuWithCheckBoxes::actionIgnores(QAction *action)
{
    actions_with_showed_menu.insert(action);
    states[action->text()] = false;
    return action;
}

void MenuWithCheckBoxes::connectChange(QAction *action)
{
    connect(action, &QAction::toggled, this, [this, action](bool s)
    {
        states.at(action->text()) = s;
        emit containedChecksChanged(action, s);

    }, Qt::QueuedConnection);
}
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Если Button 1 и Button 2 нажаты - Button 3 стала активной, как? FleXik Общие вопросы Delphi 25 11.03.2015 13:52
Не привязывается QMenu Notan1310 Qt и кроссплатформенное программирование С/С++ 2 12.01.2013 22:24
Как привязать компоненту TComboBox к Button, чтобы при нажатии Button, данные из ComboBox вводились в TstringGrid Marta_ Помощь студентам 2 15.10.2011 01:02
Button DKENT Общие вопросы Delphi 3 06.10.2010 21:17