QT新手: Add action handler for multiple objects of same type

标签 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_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() 不会给您一个好的结果,除非您在某处明确定义它。

现在,您可以将每个 QRadioButtontoggled(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/

相关文章:

c++ - 使用 Qt 进行音频信号处理 GUI 开发,如何?

c++ - 如何为 drawText 旋转文本?

c++ - 为QTableWidgetItem选择的事件

c++ - 如何摆脱 "C++ exception specification ignored"警告

c++ - Qt 4.8 - 更新 QGraphicsScene 时显示 “loading” 动画

c++ - 如何使用 QLineEdit 将 QString 添加到 QListView

c++ - 使用带有 QT4 QSQLDatabase 的 SQLite3 临时数据库

python - 在执行任务之前禁用 QPushButton

c++ - 如果 Excel.Application 不可见,activeQt 无法打开 *.xls

c++ - gSOAP 在请求完成后删除对象中的引用值