通过迭代器使用连接,信号和插槽

时间:2015-10-26 09:44:25

标签: c++ qt user-interface iterator signals-slots

我正在尝试构建一个GUI,其中有许多按钮要连接到一个插槽。因此,我想将它们添加到一个向量中,然后通过迭代器连接所有这些。

示例:

std::vector<QRadioButton*> buttonVec;
buttonVec.push_back(ui->radioA);
buttonVec.push_back(ui->radioB);
buttonVec.push_back(ui->radioC);
//...
for(std::vector<QRadioButton*>::iterator it = buttonVec.begin(); it != buttonVec.end(), it++)
    connect(*it, SIGNAL(released()), this, SLOT(handleRadioVec()));
//...

不幸的是,这会在运行时(不构建)导致错误,其中相同的连接代码行但直接对象运行时没有任何问题:

  

QObject :: connect:无法连接(null):: released()   主窗口:: handleRadioVec()

任何人都知道为什么?

2 个答案:

答案 0 :(得分:4)

您正在使用ui,我认为这意味着您的小部件是使用UIC编译器设置的。请记住,您必须先实际创建小部件(通过调用setupUi),然后才能使用它们。在那之前,ui->anything将是空指针。

请在填写setupUi(this)之前致电buttonVec

答案 1 :(得分:1)

不是答案,而是一个提示。如果您使用的是C ++ 11,则可以编写更清晰(更快)的代码:

const auto buttons =
  {
    ui->radioA,
    ui->radioB,
    // ...
  };
for ( auto btn : buttons )
  connect( btn, &QPushButton::clicked, this, &MainWindow::handleRadioVec );