Qt, передать пользовательскую переменную между формами с сигналами и слотом в цикле for

Я хотел бы передать объект в другую форму после события, в этом случае нажатой кнопки я не могу использовать QSignalMapper, потому что это не int, строка или виджет. Сигналы и слоты являются для меня единственным решением, но я не знаю, как передать переменную vTest[i].

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);
}

И что я должен сделать, чтобы передать более одного параметра?

2 ответа

Если вы используете Qt5, вы можете использовать лямбду:

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;
    //...
}

Вам не нужен слот.

Вам нужно будет ввести def свой тип vtest (чтобы дать ему имя):

typedef std::vector<Test * > TestVect;

Затем вам нужно зарегистрировать этот тип в Qt используя:

qRegisterMetaType<TestVect>("TestVect");

Тогда вы можете использовать это в вашей связи

Кроме того, если я помню, вам нужно, чтобы ваши функции слота / сигнала принимали одинаковые параметры (вы не можете иметь разные параметры).

Другие вопросы по тегам