C++ 使用迭代器连接、信号和插槽

C++ 使用迭代器连接、信号和插槽,c++,qt,user-interface,iterator,signals-slots,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<QRadioButt

我正在尝试构建一个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()));
//...
std::vector buttonVec;
按钮向前推(用户界面->收音机);
按钮向前推(ui->radioB);
按钮取消。向后推(用户界面->无线电);
//...
对于(std::vector::iterator it=buttonVec.begin();it!=buttonVec.end(),it++)
连接(*it,信号(已释放()),此,插槽(handleRadioVec());
//...
不幸的是,这会在运行时(不是构建)期间导致错误,在运行时,相同的连接代码行但与直接对象一起运行时不会出现任何问题:

QObject::connect:无法连接(null)::已释放()到 主窗口::handleRadioVec()


有人知道为什么吗?

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


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


因此,在填写
按钮前,请先调用
setupUi(this)
不是回答,而是提示。如果您使用的是C++11,则可以编写更清晰(更快)的代码:


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


从您使用的
ui
判断,您使用的是UIC。在填充
按钮前,您是否正在调用
设置UI
<代码>单击的
-将同时处理键盘/鼠标/触摸设备。从您使用的
ui
判断,您使用的是UIC。在填充
按钮前,您是否正在调用
设置UI
<代码>单击
-将处理键盘/鼠标/触摸设备。是的,但我想这表明整个GUI上的所有按钮都属于一个组-例如,将一辆车的所有轮胎分组,但如果我想将每辆车的轮胎彼此分开,该怎么办?这取决于您的逻辑。我刚刚建议使用初始化列表、自动类型、基于范围的for循环和Qt5连接语法。代码可读性提高;)是的,但我想这表明整个GUI上的所有按钮都是一个组的一部分-例如,对一辆车的所有轮胎进行分组,但是如果我想将每辆车的轮胎彼此分开怎么办?这取决于您的逻辑。我刚刚建议使用初始化列表、自动类型、基于范围的for循环和Qt5连接语法。代码可读性提高;)
const auto buttons =
  {
    ui->radioA,
    ui->radioB,
    // ...
  };
for ( auto btn : buttons )
  connect( btn, &QPushButton::clicked, this, &MainWindow::handleRadioVec );