Qt“专用插槽”:这是什么?


82

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

在类定义中,我从未见过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);

 ...

3
这不是Standard C ++,这是QT框架构造。查找QT信号和时隙
Alok保存2012年

1
当编译为C ++时,slots其定义为#define slots。使用Qt MOC进行编译时,它将为C ++编译器生成代码。
dalle 2012年

2
大声笑这对我来说更难理解,因为我已经很长时间没有使用C ++了,我以为他们增加了一些新东西
dtc 2015年

Answers:


56

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

编辑:正如弗兰克指出的,Moc只需要链接。使用标准预处理器可以定义#extra关键字。


谢谢,Qt的预处理程序是我在所发生的事情的心理模型中所缺少的。
贾斯汀

16
这是不正确的,因为“ signals”和“ slots”为空定义,所以代码一直在编译,因此编译器永远看不到它们。这些宏是moc的提示,它将生成其他代码。原始的.h和.cpp文件不会更改,即使没有moc也可以正常编译。失败的是链接,因为缺少了moc生成的定义(信号定义,元对象等)。
Frank Osterfeld '02

1
slots关键字是否必要?我试过编译/链接一些小的Qt程序,这些程序在没有slots关键字的情况下调用插槽,并且它们建立的很好。我的实验表明:signals:绝对必要,slots可能是不必要的,而且emit正如我在其他地方所读到的那样,似乎是不必要的。
这是您的App LLC

1
slots在Qt5中是不必要的。Qt更新了connect()语法,以允许将信号连接到任意函数,包括lambda。因此,slots没有必要。但是,slots关键字仍然会影响对象的QMetaObject构建方式。 moc(aka,“元对象编译器”)不会将方法识别为插槽,除非该方法位于slots:类定义的部分内。因此,尽管连接仍然有效,但自省工具中不会显示该方法。
克里斯(Chris)

19

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


30
通过信号/时隙机制调用该方法时,访问说明符将被忽略。但是插槽也是“常规”方法。当您使用传统方式调用它们时,将考虑访问说明符。
borges 2012年

4
@borges和任何未来的读者。在Qt5中,connect()方法可以使用函数指针(具有优点)。如果使用函数指针连接,则在信号/插槽机制中强制执行访问说明符。
Tod

3
@borges我认为这是不正确的,或者至少解释不清楚。访问说明符不限制您将信号连接到插槽的能力;也就是说,专用插槽可以连接到任何信号。但是,访问说明符确实会在调用成员函数时从其类中保护成员函数(以典型方式)。因此,通过信号/插槽机制进行调用时,访问说明符不会被“忽略”:它们与将插槽连接到信号无关,但是它们确实this以我们熟悉的方式保护了该功能。
这是您的App LLC

4

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

如果您将信号声明为私有的,则是说只有此类可以管理它,但是函数成员指针没有访问限制

class A{
    private:
    void e(){

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

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

除此之外,提到的其他答案也同样有效:
-您仍然可以使用技巧从外部连接专用信号和插槽
-signals并且slots为空宏且不违反语言标准


为什么这个问题没有任何支持?这有什么问题吗?我发现该语句slots对宏很有帮助。我不能connect毫无技巧地连接专用插槽功能指针,可以吗?
Arch Linux Tux

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.