【问题标题】:Qt "private slots:" what is this?Qt“私人插槽:”这是什么?
【发布时间】:2012-02-27 04:35:51
【问题描述】:

我知道如何使用它,但它的语法让我很困扰。 “私人插槽:”是做什么的?

我以前从未在类定义中看到 private 关键字和 : 之间有什么东西。这里有什么花哨的 C++ 魔法吗?

这里是例子:

 #include <QObject>

 class Counter : public QObject
 {
     Q_OBJECT

 public:
     Counter() { m_value = 0; }

     int value() const { return m_value; }

 public slots:
     void setValue(int value);

 ...

【问题讨论】:

  • 这不是标准 C++,这是 QT 框架结构。查找 QT 信号和槽
  • 编译为 C++ 时,slots 定义为 #define slots。使用 Qt MOC 编译时,它会为 C++ 编译器生成代码。
  • 哈哈,这对我来说更难理解,因为我很久没有使用 C++,我以为他们添加了一些新东西

标签: c++ qt signals-slots


【解决方案1】:

插槽是 C++ 的 Qt 特定扩展。它仅在通过 Qt 的预处理器 Meta-Object Compiler (moc) 发送代码后进行编译。有关文档,请参阅 http://doc.qt.io/qt-5/moc.html

编辑:正如弗兰克指出的那样, moc 仅用于链接。额外的关键字被标准预处理器#defined 去掉。

【讨论】:

  • 谢谢,Qt 的预处理器是我对正在发生的事情的心智模型中所缺少的。
  • 不正确,代码一直编译为“信号”和“插槽”是空定义,因此编译器永远不会看到它们。这些宏是 moc 的提示,它会生成 附加 代码。原始 .h 和 .cpp 文件不会被更改,并且在没有 moc 的情况下也可以正常编译。链接会失败,因为 moc 生成的定义(信号定义、元对象等)会丢失。
  • slots 关键字是否必要?我尝试编译/链接一些没有slots 关键字的调用槽的小型Qt 程序,它们构建得很好。我的实验表明:signals: 绝对是必要的,slots 可能是不必要的,emit 似乎是不必要的,因为我在其他地方读到过。
  • slots 在 Qt5 中不是必需的。 Qt 更新了connect() 语法以允许将信号连接到任意函数,包括 lambda。因此,slots 不是必需的。但是,slots 关键字仍然会影响对象的QMetaObject 的构建方式。 moc(又名“元对象编译器”)不会将方法识别为槽,除非它位于类定义的 slots: 部分中。因此,尽管连接仍然有效,但该方法不会显示在自省工具中。
【解决方案2】:

publicprivate 等关键字对于 Qt 插槽将被忽略。所有插槽实际上都是公共的,可以连接

【讨论】:

  • 当通过信号/槽机制调用方法时,访问说明符被忽略。但插槽也是“正常”的方法。当您使用传统方式调用它们时,会考虑访问说明符。
  • @borges 和任何未来的读者。在 Qt5 中,connect() 方法可以使用函数指针(这有优势)。如果您使用函数指针连接,则访问说明符将在信号/插槽机制中强制执行。
  • @borges 我认为这是不正确的,或者至少解释不清楚。访问说明符不会限制您将信号连接到插槽的能力;也就是说,一个私有插槽可以连接到 any 信号。然而,访问说明符确实在调用成员函数时保护其不受其类的影响(以典型方式)。因此,访问说明符在通过信号/槽机制调用时不会被“忽略”:它们与将槽连接到信号无关,但它们确实以我们熟悉的方式保护函数免受this 的影响。跨度>
【解决方案3】:

将插槽声明为私有意味着您将无法像任何其他方法一样从它们私有的上下文中引用它们。因此,您将无法将私有插槽地址传递给connect

如果您将信号声明为私有,则表示只有此类可以管理它,但 function member pointers do not have access restrictions:

class A{
    private:
    void e(){

    }
    public:
    auto getPointer(){
        return &A::e;   
    }
};

int main()
{
    A a;
    auto P=a.getPointer();
    (a.*P)();
}

除此之外,其他答案提到的也是有效的:
- 您仍然可以通过技巧从外部连接私有信号和插槽
- signalsslots 是空宏,不会违反语言标准

【讨论】:

  • 为什么这个问题没有任何赞成票?有什么问题吗?我发现声明,slots 是一个很有帮助的宏。如果没有技巧,我无法将私有插槽功能指针连接到 connect,可以吗?
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多