我有一个简单的 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 很陌生,但这看起来应该是非常基本且可行的,谢谢。
最佳答案
您可以创建一个唯一的槽并使用 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()
不会给您一个好的结果,除非您在某处明确定义它。
现在,您可以将每个 QRadioButton
的 toggled(boolchecked)
信号连接到 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)));
关于QT新手: Add action handler for multiple objects of same type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2800507/