[英]how to get the index of QList according to QSignalMapper
我有QPushButton
的QList
和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)
指向不存在按鈕。
從理論上講,您可以保留指向信號映射器的指針,並在刪除后重新映射索引。
void myclass::deleteButton(int i){
delete (Buttons.takeAt(i));
for(int i = 0; i < Buttons.size(); ++i) {
ButtonsMapper->setMapping(Buttons[i], i);
}
}
我建議你對代碼進行一些修改:
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]);
}
您可以將QPushButton映射到QWidget *
而不是將QPushButton映射到index( int
)。
- ButtonsMapper->setMapping(pb1,0);
+ ButtonsMapper->setMapping(pb1, pb1);
然后插槽也會改變
void myclass::deleteButton(QWidget * widget){
Buttons.removeOne(widget);
delete widget;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.