Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vladimir от Сентябрь 29, 2014, 16:02



Название: [РЕШЕНО] Отжать кнопку QToolButton
Отправлено: Vladimir от Сентябрь 29, 2014, 16:02
Всем привет!
Подскажите, как отжать кнопку QToolButton и спрятать встроенный в нее QWidget при нажатии на одну из кнопок Ча, Чb..
ui->btnQuickFreq->setChecked(false); не помогает! :-\
ui->btnQuickFreq - это QToolButton.


Название: Re: Отжать кнопку QToolButton
Отправлено: Johnik от Сентябрь 29, 2014, 23:07
Кнопки объедены  в QButtonGroup?
если да, то так:

Код
C++ (Qt)
group->setExclusive(false);
button->setChecked(false);
group->setExclusive(true);


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Сентябрь 30, 2014, 11:35
Кнопки объедены  в QButtonGroup?
если да, то так:

Код
C++ (Qt)
group->setExclusive(false);
button->setChecked(false);
group->setExclusive(true);

да, объеденены в btnGroupQuickFreq. но это не помогло  :-[ кнопка не отжимается и виджет не прячется!


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Сентябрь 30, 2014, 16:28
есть еще варианты??


Название: Re: Отжать кнопку QToolButton
Отправлено: GreatSnake от Сентябрь 30, 2014, 16:57
есть еще варианты??
А в чём сложность найти от нажатой кнопки (Ча, Чb..) QMenu и спратать его?


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Сентябрь 30, 2014, 22:10
есть еще варианты??
А в чём сложность найти от нажатой кнопки (Ча, Чb..) QMenu и спратать его?

Не совсем понял мысль..Кнопки делались так
Код:
        wChangeQFreq = new QWidget(this);
        btnGroupQuickFreq = new QButtonGroup(this);
        btnGroupQuickFreq->setObjectName("btnGroupQuickFreq");

        QHBoxLayout *layout   = new QHBoxLayout(wChangeQFreq);
        layout->setMargin (2);
        layout->setSpacing(2);

        for(int i = 0; i < NUMB_BTN_QUICK_FREQ; i++)
        {
            btnFreqQuickSelector.push_back(new QPushButton(this));
            btnFreqQuickSelector[i]->setObjectName(QString("btnFreqQS%1").arg(i));
            btnFreqQuickSelector[i]->setText(aws->workFreqsAWS.titleNameQuickFreqs[i]);
            btnFreqQuickSelector[i]->setFixedSize(40,40);
            btnFreqQuickSelector[i]->setCheckable(true);

            layout->addWidget(btnFreqQuickSelector[i]);
            btnGroupQuickFreq->addButton(btnFreqQuickSelector[i],i);
        }

        QWidgetAction *actQFreq = new QWidgetAction(this);
        actQFreq->setDefaultWidget(wChangeQFreq);
        ui->btnQuickFreq->addAction(actQFreq);

Вы предлагаете сделать что-то типо:
Код:
QMenu *menu = btnFreqQuickSelector[id_btn]->menu();
menu->hide();
так вылетает на hide()! Или как?


Название: Re: Отжать кнопку QToolButton
Отправлено: Johnik от Октябрь 01, 2014, 06:42
при чем тут:
Цитировать
ui->btnQuickFreq - это QToolButton
когда в QButtonGroup вы запихиваете QPushButton'ы

наведите порядок в коде, и приведенный мной код будет работать.
можно еще так:
Код
C++ (Qt)
group->setExclusive(false);
group->checkedButton()->setChecked(false);
group->setExclusive(true);


Название: Re: Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 01, 2014, 09:59
так вылетает на hide()! Или как?
А никак! Коли не в состоянии привести нормальный код.


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 11:39
при чем тут:
Цитировать
ui->btnQuickFreq - это QToolButton
когда в QButtonGroup вы запихиваете QPushButton'ы

наведите порядок в коде, и приведенный мной код будет работать.
можно еще так:
Код
C++ (Qt)
group->setExclusive(false);
group->checkedButton()->setChecked(false);
group->setExclusive(true);

так, а что не понятно из кода? ui->btnQuickFreq - это кнопка QToolButton(это я уточнил в самом первом посте). и именно ее мне нужно отжать, а не кнопки группы. т.е. я нажал, на Ча, Чб.. и у меня должна отжаться кнопка БЧ(ui->btnQuickFreq) и спрятаться виджет с кнопками Ча, Чб.. То что нужно отжимать кн-ки Ча, Чб.. так это работает из-за группы и оно реализовано. мне нужно отжать как бы "родителя" - кн-ку БЧ и спрятать виджет!


Название: Re: Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 01, 2014, 11:43
ui->btnQuickFreq - это кнопка QToolButton
Ну так и делай
Код
C++ (Qt)
ui->btnQuickFreq->menu()->hide().


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 11:46
ui->btnQuickFreq - это кнопка QToolButton
Ну так и делай
Код
C++ (Qt)
ui->btnQuickFreq->menu()->hide().

не нравится ему так - вылетает программа..оно то вроде как меню у кнопки (выглядит так), но туда засунут целый QWidget.
может поэтому


Название: Re: Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 01, 2014, 11:53
не нравится ему так - вылетает программа..
Коли ui->btnQuickFreq - QToolButton c выставленным popupMode() и заданным menu(), то значит что-то накосячил или недоговариваешь.

UPD
оно то вроде как меню у кнопки (выглядит так), но туда засунут целый QWidget.
может поэтому
Нет не поэтому.


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 12:07
не нравится ему так - вылетает программа..
Коли ui->btnQuickFreq - QToolButton c выставленным popupMode() и заданным menu(), то значит что-то накосячил или недоговариваешь.

Да, ui->btnQuickFreq - это кнопка QToolButton, созданная в дизайнере и у нее popupMode = InstantPopup, есть еще MenuButtonPopup, тогда кнопка выглядит не очень-то красиво, но даже с этим свойством вылетает при попытке спрятать меню. а, что значит заданным меню, это какое поле??! параметры меню для кнопки я никакие специально не задавал..


Название: Re: Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 01, 2014, 12:18
а, что значит заданным меню, это какое поле??! параметры меню для кнопки я никакие специально не задавал..
Понятно. Похоже Qt за тебя это сделал.
Попробуй
Код
C++ (Qt)
ui->btnQuickFreq->actions().first()->menu()->hide();


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 12:35
а, что значит заданным меню, это какое поле??! параметры меню для кнопки я никакие специально не задавал..
Понятно. Похоже Qt за тебя это сделал.
Попробуй
Код
C++ (Qt)
ui->btnQuickFreq->actions().first()->menu()->hide();

не помогает  :-\ вылетает!
Наврят ли сделал
qDebug() << ui->btnQuickFreq->menu();  ===> QObject(0x0)


Название: Re: Отжать кнопку QToolButton
Отправлено: Bepec от Октябрь 01, 2014, 12:40
диалоги слепых с глухими :) Код - код всё решит.


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 13:19
диалоги слепых с глухими :) Код - код всё решит.

=)) я же приводил код, смотри выше! Кнопка QToolButton создана в дизайнере, все что в нее помещается в коде выше!


Название: Re: Отжать кнопку QToolButton
Отправлено: Bepec от Октябрь 01, 2014, 15:06
Лично я вижу кусок кода и картинку с кнопками. Код. Проект. В архиве. CPP, H, UI, PRO, PRI, PRЯ.
Вот что имеется в виду под кодом, а не тот жалкий кусочек, что вы даёте.


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 16:10
окай. держите мин проект.


Название: Re: Отжать кнопку QToolButton
Отправлено: Johnik от Октябрь 01, 2014, 21:45
кнопка "btnQuickFreq" прекрасно "отжимается" при клике вне области этой кнопки, даже с закомментированным:
Код
C++ (Qt)
   connect(btnGroupQuickFreq,SIGNAL(buttonClicked(int)),this,SLOT(slClickButtonQuickFreq(int)));

qt 5.3.1



Название: Re: Отжать кнопку QToolButton
Отправлено: kambala от Октябрь 01, 2014, 22:04
я так понял ТС хочет, чтобы при нажатии на любую из кнопок выпадающего меню это самое меню пропадало


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 01, 2014, 22:08
я так понял ТС хочет, чтобы при нажатии на любую из кнопок выпадающего меню это самое меню пропадало

именно так! а то, что она прекрасно "отжимается" при клике вне области - это хорошо, но этого мало, она и у меня отжимается так.
К слову qt 4.8.


Название: Re: Отжать кнопку QToolButton
Отправлено: kambala от Октябрь 01, 2014, 23:50
может надо WidgetAction'у сделать
Код
C++ (Qt)
widgetAction->releaseWidget(widgetAction->defaultWidget());
?


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 02, 2014, 09:16
может надо WidgetAction'у сделать
Код
C++ (Qt)
widgetAction->releaseWidget(widgetAction->defaultWidget());
?

эффект такой же как wChangeQFreq->hide(); - кнопки прячутся, а вот меню все равно остается открытым..


Название: Re: Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 02, 2014, 09:40
Пока видится самое простое решение - это самому создать QMenu и добавить в него actQFreq.
Меню через setMenu() установить на кнопку btnQuickFreq.
Прятать меню через btnQuickFreq->menu()->hide().


Название: Re: Отжать кнопку QToolButton
Отправлено: Vladimir от Октябрь 02, 2014, 09:48
Пока видится самое простое решение - это самому создать QMenu и добавить в него actQFreq.
Меню через setMenu() установить на кнопку btnQuickFreq.
Прятать меню через btnQuickFreq->menu()->hide().

КУЛ! :) Работает) Всем спасибо за участие)


Название: Re: [РЕШЕНО] Отжать кнопку QToolButton
Отправлено: Bepec от Октябрь 02, 2014, 11:43
4 загрузки проекта и решение найдено :D


Название: Re: [РЕШЕНО] Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 02, 2014, 11:53
4 загрузки проекта и решение найдено :D
Решение было найдено и без загрузки  :)


Название: Re: [РЕШЕНО] Отжать кнопку QToolButton
Отправлено: Bepec от Октябрь 02, 2014, 12:01
Зато помогло задать наводящие вопросы :)


Название: Re: [РЕШЕНО] Отжать кнопку QToolButton
Отправлено: GreatSnake от Октябрь 02, 2014, 12:04
Зато помогло задать наводящие вопросы :)
На самом деле нет. Т.к. решение было предложено сразу же.
Единственный момент, что для меня оказалось сюрпризом, что Qt может сам создавать меню для кнопки.


Название: Re: [РЕШЕНО] Отжать кнопку QToolButton
Отправлено: Bepec от Октябрь 02, 2014, 12:20
4 загрузки было - факт. Появились дополнительные вопросы - факт.
Вывод - кому то это было надо :D