Qt中为何要将成员函数声明为slot?是否属C++11前遗留机制?
权限控制更严谨:把成员函数声明为
slot后,可以用public/protected/private修饰,Qt元对象系统会严格遵循这个权限规则。比如private slot只能被本类或友元类的信号连接,或者通过元对象调用时受权限限制;如果用普通成员函数当槽,本质是直接通过函数指针调用,相当于绕过了Qt的权限检查,容易破坏类的封装性。支持元对象系统的动态操作:声明为
slot的函数会被MOC(元对象编译器)加入元对象数据库,你可以通过QMetaObject::invokeMethod动态调用它,甚至在运行时通过字符串签名来调用;普通成员函数没这个待遇,只能在编译时确定调用关系。可视化设计支持:在Qt Designer里,只有声明为
slot的函数才会出现在槽选择列表里,方便你可视化地拖拽连接信号和槽;普通成员函数没法在Designer里直接选,只能手动写代码连接。重载函数的清晰区分:如果类里有多个同名但参数不同的重载函数,声明为
slot后,MOC会为每个重载生成独立的元数据,连接时可以用字符串签名(比如"onButtonClicked(bool)")明确指定用哪个版本;要是用普通函数指针连接,经常需要显式强制转换类型,否则编译器可能搞混重载版本。不是C++11的遗留机制:虽然C++11之后支持用lambda、普通函数指针连接信号,但
slot声明依然有不可替代的作用——上面提到的权限控制、动态调用、可视化设计这些场景,都是普通函数作为槽做不到的,至今仍是Qt框架里规范且实用的写法。
内容的提问来源于stack exchange,提问作者Arcadio Alivio Sincero

