通过迭代器使用connect、signals和slots

Use connect, signals and slots by iterator

本文关键字:signals slots connect 迭代器      更新时间:2023-10-16

我试图建立一个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: Cannot connect (null)::released() to主窗口::handleRadioVec ()

有人知道为什么吗?

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

所以在填充buttonVec之前调用setupUi(this)

不是答案,而是提示。如果你使用c++ 11,你可以写出更清晰(和更快)的代码:

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