我想在事件发生后将对象传递到另一个表单,在本例中是按下的按钮 我无法使用 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);
}
如果要传递多个参数我该怎么办?
您需要输入 def 您的 vtest 类型(为其命名):
typedef std::vector<Test * > TestVect;
然后您需要使用 Qt 注册此类型:
qRegisterMetaType<TestVect>("TestVect");
然后您可以在您的连接中使用它
另外,如果我记得的话,您需要让插槽/信号函数采用相同的参数(不能有不同的参数)。
如果您使用的是 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;
//...
}
您不需要该插槽。