指向插槽功能的指针

时间:2012-08-21 20:45:33

标签: c++ qt signals-slots

我的班级中定义了一些插槽功能,可以执行一些操作。我想创建一种可能性,允许我的类的用户定义自己的插槽函数(从我的类替换自己的函数)。我尝试通过这种方式指向插槽函数来实现它:

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传递给那里而不是指针。你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

  1. 您可以将您的插槽设为虚拟,因此派生类可以覆盖它。

  2. 您可以自己在插槽中致电m_funcTrigger

    private slots:
        void actionTrigger_slot( QAction* a)
        {
         m_funcTrigger(a);
        }