QT NOOB:为相同类型的多个对象添加操作处理程序

QT NOOB:为相同类型的多个对象添加操作处理程序,qt,qt4,Qt,Qt4,我有一个简单的QT应用程序,有10个单选按钮,名字从radio_1到radio_10。它是一个名为Selector的ui,是名为TimeSelector的类的一部分 在本设计的头文件中,我有以下内容: //! [1] class TimeSelector : public QWidget { Q_OBJECT public: TimeSelector(QWidget *parent = 0); private slots: //void on_inputSpinBox

我有一个简单的QT应用程序,有10个单选按钮,名字从radio_1到radio_10。它是一个名为Selector的ui,是名为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非常陌生,但这似乎应该是非常基本和可行的,谢谢。

您可以做的是创建您自己的单选按钮类,该类继承自QRadioButton并创建一个信号。此信号可以具有您想要的所有参数

void CheckWithReference(YourRadioButtonClass* rb);

或者你想要的任何东西


然后在
TimeSelector
类中创建一个插槽,该插槽具有将连接到所有信号的相同参数集。

您可以创建一个唯一插槽,并使用
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 << ".";
    }
  }

在radiobutton案例中,将按钮添加到QButtonGroup。
类似的功能提供QSignalMapper。

请注意,
QSpinBox
QRadioButton
没有相同的信号和方法。最值得注意的是,在
QRadioButton
上没有
valueChanged(int)
信号,但在
QRadioButton
选中状态更改时会发出
toggled(bool)
信号。虽然这种方法可行,但我不推荐Qt初学者使用。我在设计器中发现,您可以选择按钮,右键单击并将其指定给按钮组。但在我看来,您的方法更好,因为它也可以应用于其他控件,例如滑块和编辑框。
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 << ".";
    }
  }
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)));