我有QPushButton和QSignalMapper的QList来识别按下哪个按钮.
所以我做了类似的事情(我的项目非常大,所以我只剪切了问题所需的行)
所以我做了类似的事情(我的项目非常大,所以我只剪切了问题所需的行)
QList<QPushButton*> Buttons; QList <QLabel*> LabelList1; QList <QLabel*> LabelList2; QList <QLabel*> LabelList3; QList <QLabel*> LabelList4; QSignalMapper *ButtonsMapper; ButtonsMapper= new QSignalMapper(this); connect(ButtonsMapper,SIGNAL(mapped(int)),this,SIGNAL(ButtonsClicked(int))); connect(this,SIGNAL(ButtonsClicked(int)),SLOT(deleteButton(int))); Buttons.append(new QPushButton(tr("0")));//first button LabelList1.append(new QLabel(tr("0"))); LabelList2.append(new QLabel(tr("0"))); LabelList3.append(new QLabel(tr("0"))); LabelList4.append(new QLabel(tr("0"))); QPushButton * pb1 = Buttons.last();//pointer to the last button connect(pb1,SIGNAL(clicked()),ButtonsMapper,SLOT(map())); ButtonsMapper->setMapping(pb1,0); Buttons.append(new QPushButton(tr("1")));//second button LabelList1.append(new QLabel(tr("1"))); LabelList2.append(new QLabel(tr("1"))); LabelList3.append(new QLabel(tr("1"))); LabelList4.append(new QLabel(tr("1"))); QPushButton * pb2 = Buttons.last();//pointer to the last button connect(pb2,SLOT(map())); ButtonsMapper->setMapping(pb2,1);
并且按下了删除按钮的函数deleteButton.如果我做那样的事情
void myclass::deleteButton(int i){ delete (Buttons.takeAt(i)); delete ( LabelList1.takeAt(i)); delete ( LabelList2.takeAt(i)); delete( LabelList3.takeAt(i)); delete( LabelList4.takeAt(i)); }
该函数可能导致索引超出范围错误,如果我删除第一个按钮,然后我按下第二个按钮,函数Buttons.takeAt(i)指向不存在按钮.
解决方法
从理论上讲,您可以保留指向信号映射器的指针,并在删除后重新映射索引.
void myclass::deleteButton(int i){ delete (Buttons.takeAt(i)); for(int i = 0; i < Buttons.size(); ++i) { ButtonsMapper->setMapping(Buttons[i],i); } }