Qt"私人老虎机:"这是什么?

Jus*_*tin 73 c++ qt signals-slots

我理解如何使用它,但它的语法困扰我.什么是"私人老虎机"呢?

我以前从未在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);

 ...
Run Code Online (Sandbox Code Playgroud)

Rus*_*vis 53

插槽是C++特定于Qt的扩展.它只在通过Qt的预处理器,元对象编译器(moc)发送代码后编译.有关文档,请参见http://doc.qt.io/qt-5/moc.html.

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

  • 不正确,代码一直编译为"信号"和"槽"为空定义,因此编译器永远不会看到它们.这些宏是moc的提示,它生成_additional_代码.原始的.h和.cpp文件不会被更改,并且在没有moc的情况下编译就好了.什么会失败是链接,因为moc生成的定义(信号定义,元对象等)否则将丢失. (15认同)
  • `slots` 关键字是否必要?我尝试编译/链接一些小型 Qt 程序,这些程序在没有“slots”关键字的情况下调用插槽,并且它们构建得很好。我的实验表明:“signals:”肯定是必要的,“slots”可能是不必要的,而“emit”似乎是不必要的,正如我在其他地方读到的那样。 (2认同)
  • 在 Qt5 中不需要 `slots`。Qt 更新了 `connect()` 语法以允许将信号连接到任意函数,包括 lambdas。因此,不需要`slots`。然而,`slots` 关键字仍然影响对象`QMetaObject` 的构建方式。`moc`(又名“元对象编译器”)不会将方法识别为插槽,除非它位于类定义的 `slots:` 部分中。因此,尽管连接仍然有效,但该方法不会出现在自省工具中。 (2认同)

And*_*rew 17

对于Qt插槽public,private将忽略诸如的关键字.所有插槽实际上都是公共的,可以连接

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