QT NOOB:为相同类型的多个对象添加操作处理程序
我有一个简单的QT应用程序,有10个单选按钮,名字从radio_1到radio_10。它是一个名为Selector的ui,是名为TimeSelector的类的一部分 在本设计的头文件中,我有以下内容: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
//! [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)));