How to get QList index according to QSignalMapper

I have a QList from QPushButton and QSignalMapper to find out which button is clicked. So I did something like this (my project is very large, so I cut only the lines needed to answer the question)

 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)),this,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, SIGNAL(clicked()), ButtonsMapper, SLOT(map())); ButtonsMapper->setMapping(pb2,1); 

and the deleteButton function was pressed, which was supposed to delete the button. If I do something like this

 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)); } 

this function can lead to an index out of range error if I delete the first button and then press the second button, the Buttons.takeAt(i) button indicates the absence of an existing button.

+4
source share
3 answers

Theoretically, you could keep a pointer on a file of signals around and reassign indices after deletion.

 void myclass::deleteButton(int i){ delete (Buttons.takeAt(i)); for(int i = 0; i < Buttons.size(); ++i) { ButtonsMapper->setMapping(Buttons[i], i); } } 
+1
source

I suggest you some modification of your code:

 QMap<QPushButton*,int> Buttons; QSignalMapper *ButtonsMapper; ButtonsMapper= new QSignalMapper(this); connect(ButtonsMapper, SIGNAL(mapped(int)),this,SIGNAL(ButtonsClicked(int))); connect(this, SIGNAL(ButtonsClicked(int)),this,SLOT(deleteButton(int))); Buttons.insert (new QPushButton(tr("0")),0);//first button QPushButton * pb1 = Buttons.last();//pointer to the last button connect(pb1, SIGNAL(clicked()), ButtonsMapper, SLOT(map())); ButtonsMapper->setMapping(pb1,0); Buttons.insert (new QPushButton(tr("1")),1);//second button QPushButton * pb2 = Buttons.last();//pointer to the last button connect(pb2, SIGNAL(clicked()), ButtonsMapper, SLOT(map())); ButtonsMapper->setMapping(pb2,1); void myclass::deleteButton(int i){ if (Buttons.contains(i)) delete (Buttons[i]); } 
0
source

Instead of matching QPushButton with an index ( int ), you can map it to QWidget * .

 - ButtonsMapper->setMapping(pb1,0); + ButtonsMapper->setMapping(pb1, pb1); 

Then the slot will also change

 void myclass::deleteButton(QWidget * widget){ Buttons.removeOne(widget); delete widget; } 
0
source

Source: https://habr.com/ru/post/1432724/


All Articles