【发布时间】:2020-06-26 15:49:55
【问题描述】:
如何通过槽将参数传递给函数getFunction?
funcMenu->addAction("&1", garphArea, SLOT(getFunction(2)));
【问题讨论】:
-
插槽接收到信号。您只需要发出信号,并在其中传递参数。
如何通过槽将参数传递给函数getFunction?
funcMenu->addAction("&1", garphArea, SLOT(getFunction(2)));
【问题讨论】:
根据文档here,它是Functor。动作的triggered() 信号连接到函子。函子可以是指向 context 对象的成员函数的指针。
因此,在您的情况下,第三个参数应该是指向上下文对象 garphArea 的成员函数的指针
您可以参考this 了解如何将函数指针作为参数传递。
此外,SIGNAL 和 SLOT 中的参数数量必须匹配。这里triggered() 信号没有参数,所以我不确定您是否可以直接连接到接受参数的成员函数。也许,连接到不带参数的成员函数并在其中调用所需的函数。
编辑 1:
我看到您正在使用this 方便的函数来调用您的插槽。它表明动作的triggered() 信号连接到接收者的 成员槽。但仍要使其正常工作,请尝试在不使用 SLOT 的情况下拨打电话,例如:
funcMenu->addAction("&1", garphArea, getFunction());
或
funcMenu->addAction("&1", garphArea, getFunction);
我还没有测试过这行代码,但它应该能给你一些想法。不过,我上面关于论点的 cmets 仍然适用。
【讨论】:
使用现代 C++ 和 Qt5,最简单的方法是不直接连接到插槽,而是 connect it to a lamda,它可以满足您的要求:
funcMenu->addAction("&1", graphArea, [graphArea](){
graphArea->getFunction(2);
});
以上代码假定graphArea 是一个指针,并按值捕获它。您应该学习 C++ lambda 以更全面地理解这一点,或者如果您想要的不仅仅是上面的内容。使用 lambda 时有很多细微差别和小脏细节(例如,何时按值捕获,何时按引用),很容易用错。
历史记录:在 Qt4 中,正确的做法是使用 QSignalMapper,但在我看来,它相当不直观,并且比使用 lambda 开销更大。
【讨论】: