Qt,在 for 循环中使用信号和槽在表单之间传递自定义变量

问题描述 投票:0回答:2

我想在事件发生后将对象传递到另一个表单,在本例中是按下的按钮 我无法使用 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);
}

如果要传递多个参数我该怎么办?

qt variables parameters signals
2个回答
1
投票

您需要输入 def 您的 vtest 类型(为其命名):

typedef std::vector<Test * > TestVect;

然后您需要使用 Qt 注册此类型:

qRegisterMetaType<TestVect>("TestVect");

然后您可以在您的连接中使用它

另外,如果我记得的话,您需要让插槽/信号函数采用相同的参数(不能有不同的参数)。


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

您不需要该插槽。

© www.soinside.com 2019 - 2024. All rights reserved.