我在我的类中定义了一些槽函数来执行一些操作。我想创造一种可能性,允许我的班级的用户定义他自己的插槽函数(将我班级中的函数替换为他自己的函数)。我试图通过这种方式通过指向插槽函数的指针来实现它:
class asd {
Q_OBJECT
private:
void ( asd::*m_funcTrigger )( QAction* );
public:
asd();
// and some method to pass the pointer
private slots:
void actionTrigger( QAction* );
};
构造函数:
asd::asd() {
// set the slot function from class as default
m_funcTrigger = &asd::actionTrigger;
// m is a QMenu object
connect(m, SIGNAL(triggered(QAction*)), this, SLOT(m_funcTrigger(QAction*)));
}
我认为 actionTrigger 的实现并不重要。
因此,当我将 actionTrigger 放入 SLOT() 时,它可以正常工作。当我把 m_funcTrigger 放在那里时,它没有 - 没有任何反应(Qt 找不到插槽)。我确信这是因为指针不在类的插槽部分中,所以我把它放在那里:
private slots:
void ( asd::*m_funcTrigger )( QAction* );
void actionTrigger( QAction* );
但我得到了奇怪的错误:
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): error MSB6006: "cmd.exe" exited with code 1.
我完全不知道该如何处理。
编辑:
我认为 Qt 没有找到它的原因:根据我在 Internet 上阅读的内容,SLOT() 只返回一个简单的 const char*,其中包括传递给 SLOT 的方法的标识符名称,因此 Qt 完全没有不知道指针指向什么。它只关注 m_funcTrigger( QAction* ) 函数。
我创建了另一个解决方案(我稍后将把它放在这里,我现在正在工作),它要求类的用户将 SLOT(hisOwnFunction()) 传递给设置槽函数的函数。因为该类使用信号槽的想法,所以它依赖于 Qt,因此我认为可以在那里传递 SLOT 而不是指针。你怎么看?