QT NOOB: добавить обработчик действий для нескольких объектов одного типа - PullRequest
2 голосов
/ 10 мая 2010

У меня есть простое приложение QT с 10 переключателями с именами от radio_1 до radio_10. Это пользовательский интерфейс с именем Selector, который является частью класса TimeSelector

В моем заголовочном файле для этого дизайна, у меня есть это:

//! [1]
class TimeSelector : public QWidget
{
    Q_OBJECT

public:
    TimeSelector(QWidget *parent = 0);

private slots:
    //void on_inputSpinBox1_valueChanged(int value);
    //void on_inputSpinBox2_valueChanged(int value);

private:
    Ui::Selector ui;
};
//! [1]

закомментированный void_on_inputSpinBox1_valueChanged (int value) из учебника для простого калькулятора. Я знаю, что могу сделать:

void on_radio_1_valueChanged(int value);

но мне нужно 10 функций. Я хочу иметь возможность создать одну функцию, которая работает для всего, и позволяет мне передать, возможно, имя переключателя, который вызвал ее, или ссылку на переключатель, чтобы я мог работать с ним и определить, кто это.

Я очень новичок в QT, но похоже, что он должен быть очень простым и выполнимым, спасибо.

Ответы [ 3 ]

4 голосов
/ 10 мая 2010

Вы можете создать уникальный слот и получить объект, испустивший сигнал, методом QObject::sender(). Следующий код представляет пример такого слота:

public slots:
  void onRadioToggled(bool checked)
  {
    QRadioButton *radio = qobject_cast< QRadioButton* >(QObject::sender());
    // radio is the object that emitted the triggered signal
    // if the slot hasn't been triggered by a QRadioButton, radio would be NULL
    if (radio) {
      qDebug() << radio->objectName() << " is set to " << checked << ".";
    }
  }

Обратите внимание, что radio->objectName() не даст вам хорошего результата, если вы не определите его где-то явно.

Теперь вы можете подключить сигнал toggled(bool checked) каждого QRadioButton к слоту onRadioToggled. Обратите внимание, что QRadioButton не имеет никакого сигнала valueChanged, поэтому ваш код фактически не может работать.

connect(radio_1, SIGNAL(toggled(bool)), SLOT(onRadioToggled(bool)));
connect(radio_2, SIGNAL(toggled(bool)), SLOT(onRadioToggled(bool)));
...
connect(radio_10, SIGNAL(toggled(bool)), SLOT(onRadioToggled(bool)));
1 голос
/ 10 мая 2010

В случае с радиокнопками добавьте кнопки в QButtonGroup. Аналогичные функциональные возможности предлагает QSignalMapper.

0 голосов
/ 10 мая 2010

Что вы можете сделать, это создать свой собственный класс переключателей, который наследуется от QRadioButton, и создать сигнал. Этот сигнал может иметь все параметры, которые вы хотите.

void CheckWithReference(YourRadioButtonClass* rb);

или

void CheckWithReference(QString RadioButtonName);

или все, что вы хотели бы иметь.

Затем создайте слот в вашем классе TimeSelector с тем же набором параметров, который вы будете подключать ко всем сигналам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...