通过迭代器使用连接、信号和槽
Use connect, signals and slots by iterator
我正在尝试构建一个 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
MainWindow::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 );
我正在尝试构建一个 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 MainWindow::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 );