как получить индекс QList по QSignalMapper

я имею QList из QPushButtonи QSignalMapper распознать, какая кнопка нажата.
Поэтому я сделал что-то подобное (мой проект очень большой, поэтому я обрезал только строки, необходимые для вопроса)

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

и функция 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));
}

эта функция может привести к index out of range ошибка, если я удаляю первую кнопку, а затем нажимаю на вторую кнопку, функция Buttons.takeAt(i) указать на не существует кнопку.

4

Решение

Теоретически, вы можете хранить указатель на преобразователь сигналов и перераспределять индексы после удаления.

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

Другие решения

Я предлагаю вам некоторые модификации вашего кода:

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

Вместо отображения QPushButton в index (int) вы можете сопоставить его с QWidget *,

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

Тогда слот также изменится

void myclass::deleteButton(QWidget * widget){
Buttons.removeOne(widget);
delete widget;
}
0
По вопросам рекламы [email protected]