我的班级中定义了一些插槽功能,可以执行一些操作。我想创建一种可能性,允许我的类的用户定义自己的插槽函数(从我的类替换自己的函数)。我尝试通过这种方式指向插槽函数来实现它:
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):错误MSB6006:“cmd.exe”已退出,代码为1。
我完全不知道如何处理这个问题。
修改
我认为Qt找不到它的原因是: 从我通过Internet阅读的内容来看,SLOT()只返回一个简单的const char *,其中包含传递给SLOT的方法的标识符名称,因此Qt完全不知道指针指向的是什么。它只关注m_funcTrigger(QAction *)函数。
我创建了另一个解决方案(我将在以后将其放在此处工作),它要求类的用户将SLOT(hisOwnFunction())传递给设置插槽功能的函数。因为该类使用信号槽的想法,所以它依赖于Qt,我认为因为可以将SLOT传递给那里而不是指针。你觉得怎么样?
答案 0 :(得分:1)
您可以将您的插槽设为虚拟,因此派生类可以覆盖它。
您可以自己在插槽中致电m_funcTrigger
:
private slots:
void actionTrigger_slot( QAction* a)
{
m_funcTrigger(a);
}