加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何根据QSignalMapper获取QList的索引

发布时间:2020-12-16 07:01:14 所属栏目:百科 来源:网络整理
导读:我有QPushButton和QSignalMapper的QList来识别按下哪个按钮. 所以我做了类似的事情(我的项目非常大,所以我只剪切了问题所需的行) QListQPushButton* Buttons;QList QLabel* LabelList1;QList QLabel* LabelList2;QList QLabel* LabelList3;QList QLabel* Lab
我有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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读