2015-10-05 13 views
-1

我想傳遞一個事件後的對象到另一個表單,在這種情況下,按下按鈕 我不能使用QSignalMapper,因爲它不是一個int,字符串或小部件。 信號和插槽是我唯一的解決方案,但我不知道如何傳遞vTest [i]變量。Qt,傳遞一個自定義變量之間的形式與信號和插槽在一個for循環

std::vector<Test * > vTest; 
... fill vTest ... 
for(int i = 0; i < vTest.size(); i++) 
{ 
QPushButton * pButton = new QPushButton(vTest[i]->getTestName()); 
connect(pButton,SIGNAL(clicked(bool)),this,SLOT(slotGoNextPage(???)));  
} 

這裏是功能插槽slotGoNextPage

void slotGoNextPage(){ 

    goNextPage(); } 
... 
void goNextPage(){ 

pForm->var = ?? // value which comes from vTest[i] 
stackedWidget_page->setCurrentIndex(1); 
} 

我應該做的傳遞比一個參數的更多東西的電話嗎?

回答

0

您需要高清輸入您VTEST型(給它一個名稱):

typedef std::vector<Test * > TestVect; 

然後,你需要使用註冊此類型使用Qt:

qRegisterMetaType<TestVect>("TestVect"); 

然後你可以使用這在你的連接

另外,如果我記得,你需要你的插槽/信號功能採取相同的參數(你不能有不同的參數)。

+0

看起來他需要通過'Test *',而不是向量本身。 – dtech

+0

好的,謝謝。如果是這種情況,您不需要執行typedef,但仍需要使用元編譯器註冊「Test」 - 這是重要的部分:) –

+0

是的,我只是想通過Test *。 謝謝你的建議! – RobertAalto

1

如果您正在使用QT5,你可以使用lambda:

std::vector<Test * > vTest; 
for(int i = 0; i < vTest.size(); i++) { 
    QPushButton * pButton = new QPushButton(vTest[i]->getTestName()); 
    connect(pButton, &QPushButton::clicked, [=](){ this->goNextPage(vTest[i]); });  
} 

當然,這意味着gonextPage()將不得不採取在Test *參數:

void goNextPage(Test * t) { 
    pForm->var = t; 
    //... 
} 

你不需要插槽。