2012-08-29 120 views
2

在我的Qt應用程序中,我動態創建了一些小部件。其中包括需要具有類似行爲的QToolButton。Qt:動態小部件信號和插槽連接

這裏是如何的小部件創建:

QMap<QString, QToolButton*> unselectButtonMap; 
foreach(QString instance, ...) { 
    unselectButtonMap[instance] = new QToolButton; 
    myLayout->addWidget(unselectButtonMap[instance]); 
    QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance())); 
} 

現在我想的unselectInstence插槽知道哪個實例而言。

我首先想到的是將實例名稱作爲插槽的參數,但插槽僅從信號中獲取參數。這個想法是這樣的:

QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),this,SLOT(unselectInstance(instance))); 

有關如何做到這一點的任何其他想法?

注:我使用的是Qt4.8

編輯:基於的答案,因爲我需要的實例名稱,而不是QToolButton本身,這裏是我走過來

void MyWindow::unselectInstance() { 
    foreach(QString instance, unselectButtonMap.keys()) { 
    if(unselectButtonMap[instance] == QObject::sender()) { 
     //do stuff here... 
    } 
    } 
} 

指針比較似乎工作得很好。

重新編輯:和基於user1313312的答案,我們將宣佈一個QSignalMapper:

QSignalMapper *signalMapper = new QSignalMapper(this); 
QObject::connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(unselectInstance(QString))); 

那麼QToolButton連接映射

signalMapper->setMapping(unselectButtonMap[instance], instance); 
QObject::connect(unselectButtonMap[instance],SIGNAL(clicked()),signalMapper,SLOT(map())); 

與槽會更簡單:

void MyWindow::unselectinstance(QString instance) { 
    //do stuff here... 
} 

回答

2

雖然使用QObject::sender()是完全正常的,理想主義的做法是QSignalMapper

+0

你說得對。它避免做自己的習慣和比較。謝謝。 – Yosko

2

在您的插槽中使用QObject::sender()以獲取發件人。它會返回發出信號的對象。希望這可以幫助。

+0

完美,正是我需要的。謝謝。 – Yosko