【问题标题】:Pointer to a slot function指向槽函数的指针
【发布时间】:2012-08-21 20:45:32
【问题描述】:

我在我的类中定义了一些槽函数来执行一些操作。我想创造一种可能性,让我的班级的用户定义他自己的插槽函数(将我班级的函数替换为他自己的函数)。我试图通过这种方式通过指向插槽函数的指针来实现它:

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没有找到它的原因: 根据我在互联网上阅读的内容,SLOT() 只返回一个简单的 const char*,其中包括传递给 SLOT 的方法的标识符名称,因此 Qt 完全不知道指针指向什么。它只关注 m_funcTrigger( QAction* ) 函数。

我创建了另一个解决方案(我将在稍后将它放在这里,我目前正在工作),它要求类的用户将 SLOT(hisOwnFunction()) 传递给设置槽函数的函数。因为该类使用信号槽的想法,所以它依赖于 Qt,因此我认为可以在那里传递 SLOT 而不是指针。你怎么看?

【问题讨论】:

  • 执行相同任务的更现代的 OOP 方法是提供一个 setter 方法来接受来自用户的函子 - 这个函子将由您的插槽调用。只需使用已设置的默认类实例化该类。每个人都赢了。
  • 响应编辑:用户还必须传递QObject 派生实例,SLOT(hisOwnFunction()) 对其进行操作,但如果它有效并且你很高兴,那就去吧。但请注意,这是一个非常非 Qt 模式(将 SLOTS 传递给方法 args onlyconnect(..) 中完成,其他地方都没有),它也有 no 编译时间检查(它只是一个字符串化的函数签名) - 所以如果其他人要扩展/维护你的工作,我会避免这种深奥的解决方案。
  • @cbamber85 好吧,如果有人不喜欢它,我并不完全高兴:p。至少它现在有效,但我会用函子尝试你的建议,但我必须先阅读它。谢谢。

标签: c++ qt signals-slots


【解决方案1】:
  1. 您可以将插槽设为虚拟,以便派生类可以覆盖它。

  2. 您可以在自己的插槽中拨打m_funcTrigger

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多