Как сказать, когда QPushButton щелкают в QButtonGroup

В моем проекте у меня 40 QPushButtonвсе положить в QButtonGroup как это:

QButtonGroup* group = new QButtonGroup(this);
group->addButton(ui->slot_0);
group->addButton(ui->slot_1);
//...
group->addButton(ui->slot_38);
group->addButton(ui->slot_39);

Каждая кнопка является QPushButton что я сделал проверяемым. Таким образом, только одна кнопка может быть проверена за один раз. Все отлично работает, но как я могу «сделать слот», когда одна из кнопок становится проверенной? Я не хочу иметь 40 разных слотов, по одному на каждую кнопку, чтобы в конечном итоге делать одно и то же. Есть ли способ, которым я могу просто использовать QButtonGroup Я положил их в?

2

Решение

Как заявили Джамин и Никос: вы должны создать свой собственный слот для обработки сигнала, излучаемого QButtonGroup. Это может быть что-то вроде этого:

В заголовочном файле:

public slots:

void buttonWasClicked(int);

В файле * .cpp:

void MainWindow::buttonWasClicked(int buttonID)
{
cout << "You have clicked button: " << buttonID << endl;
}

И в коде, отвечающем за создание MainWindow (т.е. в конструкторе, но не обязательно), должна быть следующая строка:

    connect(group, SIGNAL(buttonClicked(int)), this, SLOT(buttonWasClicked(int)));

Имейте в виду, что начиная с Qt5 синтаксис соединения изменился. Синтаксис, который я здесь использовал, взят из Qt4. Это все еще работает, но не рекомендуется (для получения дополнительной информации обратитесь к Новый синтаксис слота сигналов в Qt 5). Более того, я бы посоветовал перейти к справке по классам QButtonGroup, так как есть другие доступные сигналы, которые могут удовлетворить ваши потребности лучше, чем тот, который я выбрал.

BR

2

Другие решения

Документация для QButtonGroup показывает QButtonGroup::buttonClicked() сигнал — вы уже пробовали это?

Сигнал приходит в двух вариантах — один, который дает QPushButton в качестве параметра (как QAbstractButton) и тот, который дает идентификатор кнопки в группе.

Ты можешь использовать connect() для настройки соединения сигналов и слотов в вашем коде C ++.

Когда-нибудь во время инициализации класса вашего окна (возможно, в конструкторе), вызовите это:

connect(myButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(theSlotThatYouWrite(QAbstractButton*));

куда myButtonGroup возможно this->ui->nameOfTheButtonGroup, а также theSlotThatYouWrite это функция, которую вы пишете в своем собственном коде, которая принадлежит классу вашего окна, которая возвращает void и принимает сигнал QAbstractButton* в качестве параметра (так как это то, что этот конкретный сигнал дает в качестве аргумента).

Удостовериться theSlotThatYouWrite находится под меткой «private slots:» или «public slots:» в интерфейсе вашего класса.

Вот скриншот фактического использования некоторых сигналов и слотов в моем собственном коде.

Нажмите, чтобы увидеть в полный размер

Сигналы и слоты очень важны для изучения, но они могут быть чем-то вроде подъема, когда вы впервые пытаетесь это понять!

3