Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Ноябрь 19, 2014, 17:27



Название: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 19, 2014, 17:27
Как можно реализовать GroupBox с кнопками, чтобы при выборе одной кнопки она зажималась, и в дальнейшем при выборе последующих, предыдущая отжималась, а выбранная зажималась? Какой флаг нужно установить для QGroupBox? быть может
нужно использовать свойство isChecked?


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: gil9red от Ноябрь 19, 2014, 18:00
Эээ... добавить QRadioButton кнопки в QButtonGroup (http://qt-project.org/doc/qt-4.8/qbuttongroup.html)


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 20, 2014, 00:52
Эээ... добавить QRadioButton кнопки в QButtonGroup (http://qt-project.org/doc/qt-4.8/qbuttongroup.html)
Дело в том, что мне не нужны QRadioButton кнопки, я хочу это сделать для QPushButton.


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: Kurles от Ноябрь 20, 2014, 01:45
в чём проблема?

в конструкторе:
Код
C++ (Qt)
   QButtonGroup *group = new QButtonGroup(this);
   connect(group, SIGNAL(buttonClicked(QAbstractButton*)),
           this, SLOT(onButtonClicked(QAbstractButton*)));
   group->addButton(pushButton_1);
   group->addButton(pushButton_2);
   group->addButton(pushButton_3);
   //....
   group->addButton(pushButton_n);
 
в cлоте onButtonClicked(QAbstractButton*):
Код
C++ (Qt)
void SomeClass::onButtonClicked(QAbstractButton *button)
{
   QButtonGroup *group = qobject_cast<QButtonGroup*>(sender());
   if (group) {
       Q_FOREACH(QAbstractButton *b, group->buttons()) {
           b->blockSignals(true);
           b->setChecked(b == button);
           b->blockSignals(false);
       }
   }
}
 
Естественно у кнопок свойство checkable выставить в true.


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 20, 2014, 01:56
спасибо) используя ваши советы, уже сделал вот так:
Код:
    QGridLayout *layout = new QGridLayout;
    layout->setSpacing(3);
    layout->setDefaultPositioning(3, Qt::Horizontal);

    QGroupBox *box = new QGroupBox(this);
    box->setFixedSize(200, 200);
    box->move(20, 20);
    box->setLayout(layout);

    QButtonGroup *grp = new QButtonGroup(box);
    grp->setExclusive(true);

    QPushButton *but[4];
    for(int i=0; i<4; i++){
        but[i] = new QPushButton(box);
        but[i]->setFixedSize(50, 30);
        but[i]->setText(QString::number(i+1));
        but[i]->setCheckable(true);
        grp->addButton(but[i], i);
        layout->addWidget(but[i]);
    }


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 20, 2014, 09:38
а как такую же группу создать для QLabel-ов? или они вообще не могут быть нажатыми и отжатыми?


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: gil9red от Ноябрь 20, 2014, 12:03
а как такую же группу создать для QLabel-ов? или они вообще не могут быть нажатыми и отжатыми?

Неа, посмотрите в документацию и вы увидите, что QLabel'ы не кликабельны :)
А как вы представляете себе нажатый QLabel? :)


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 20, 2014, 12:59
а как такую же группу создать для QLabel-ов? или они вообще не могут быть нажатыми и отжатыми?

Неа, посмотрите в документацию и вы увидите, что QLabel'ы не кликабельны :)
А как вы представляете себе нажатый QLabel? :)
в некоторых средах разработки это возможно, он просто вокруг выделяется пунктирной линией когда выбран.


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: Johnik от Ноябрь 20, 2014, 13:32
... он просто вокруг выделяется пунктирной линией когда выбран.
Так можно сделать из QPushButton


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 20, 2014, 13:36
ясно


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: DenKor29 от Ноябрь 21, 2014, 08:18
а как такую же группу создать для QLabel-ов? или они вообще не могут быть нажатыми и отжатыми?

Неа, посмотрите в документацию и вы увидите, что QLabel'ы не кликабельны :)
А как вы представляете себе нажатый QLabel? :)

Вроде QLabel кликабелен. Можно реализовать гиперссылки.

void QLabel::linkActivated ( const QString & link ) [signal]

This signal is emitted when the user clicks a link. The URL referred to by the anchor is passed in link.

This function was introduced in Qt 4.2.


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: Bepec от Ноябрь 21, 2014, 11:47
Я по секрету скажу что все виджеты кликабельны :)


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 21, 2014, 13:56
 :) ну это понятно)


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: gil9red от Ноябрь 22, 2014, 00:27
а как такую же группу создать для QLabel-ов? или они вообще не могут быть нажатыми и отжатыми?

Неа, посмотрите в документацию и вы увидите, что QLabel'ы не кликабельны :)
А как вы представляете себе нажатый QLabel? :)
в некоторых средах разработки это возможно, он просто вокруг выделяется пунктирной линией когда выбран.

Это вы про дизайнеры форм? QLabel везде одинаковый, а в дизайнерах, я уверен, используется графические сцены, а учитывая что на сцены можно размещать и виджеты и элементы сцены все перемещаемые и выделяемые :)

Вы можете реализовать свой класс QLabel и в нем переопределить событие paintEvent и вручную нарисовать рамку


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: billy4685 от Ноябрь 24, 2014, 09:05
а как такую же группу создать для QLabel-ов? или они вообще не могут быть нажатыми и отжатыми?

Неа, посмотрите в документацию и вы увидите, что QLabel'ы не кликабельны :)
А как вы представляете себе нажатый QLabel? :)
в некоторых средах разработки это возможно, он просто вокруг выделяется пунктирной линией когда выбран.

Это вы про дизайнеры форм? QLabel везде одинаковый, а в дизайнерах, я уверен, используется графические сцены, а учитывая что на сцены можно размещать и виджеты и элементы сцены все перемещаемые и выделяемые :)

Вы можете реализовать свой класс QLabel и в нем переопределить событие paintEvent и вручную нарисовать рамку
спасибо за совет)


Название: Re: Как реализовать QGroupBox c QPushButton, чтобы кнопки зажимались как RadioButton
Отправлено: Johnik от Ноябрь 24, 2014, 09:19
Вы можете реализовать свой класс QLabel и в нем переопределить событие paintEvent и вручную нарисовать рамку

Или так:
Код
C++ (Qt)
QLabel* label = new QLabel("some text");
label->setStyleSheet("QLabel {  border: 1px dotted red; }");