2012-09-06 15 views
4

我有QListQPushButtonQSignalMapper來識別哪個按鈕被按下。 所以我做類似的東西(我的項目是非常大的,所以我切需要的問題只是線)如何根據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)),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)點不存在按鈕。

回答

1

從理論上說,你可以保持一個指針周圍的信號映射器,並刪除後重新映射索引。

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

我認爲最好的變種 –

+0

它的好,如果我有1 QList,但我至少有8 QList,我應該刪除evrytime ... –

0

我建議你你的代碼的一些modifiacation:

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

QMAP不適合我的項目,我需要組織,不跳過的陣列.... –

+0

類似,INT指數= Buttons.indexOf (ButtonsMapper->映射(I));哪些不起作用 –

+0

爲什麼你需要列表?如果你不需要它,除了點擊後刪除之外,你可以用'QObject *'作爲映射。 –

0

不是映射QPushButton索引(int)的,你可以把它映射到QWidget *

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

然後插槽也將改變

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

它是好的但不是我的項目,因爲我有8 QList,我想刪除evry時間從evryone根據QPushButton一個單元被推...我編輯我的問題,所以你可以理解.... tnx –

相關問題