连接到派生 class 中的受保护插槽
Connect to protected slot in derived class
基础 class 中的声明如下所示:
protected:
void indexAll();
void cleanAll();
在导出的class中,以下不编译:
indexAll(); // OK
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll); // ERROR
connect(&_timer, SIGNAL(timeout()), this, SLOT(indexAll())); // OK
我想使用 connect
的第一个变体,因为它会进行一些编译时检查。为什么会返回错误:
error: 'void Files::FileIndex::indexAll()' is protected
void FileIndex::indexAll()
^
[...].cpp:246:58: error: within this context
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll);
^
第一个由正常的 C++ 可访问性规则规定。 QTimer::timeout 信号直接通过提供的函数指针调用 FileIndex::indexAll。当然,这只有在这个函数指针为public时才有可能(忽略可能的友解)。如果您使用函数指针,您甚至不需要在头文件中将函数标记为 SLOT。
第二个是moc魔法。通过元对象系统调用。我从来没有更深入地研究过这个话题……它只是奏效了。 :-)
好吧,这不是最好的解释。如果您想了解更多信息:
http://woboq.com/blog/new-signals-slots-syntax-in-qt5.html
http://woboq.com/blog/how-qt-signals-slots-work.html
http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
不错的读物,但是...只有当您对 Qt 的更深层次的工作感兴趣时才会感兴趣。恕我直言,仅当您想开发 Qt 本身时才需要。
'old' 样式语法有效,因为信号发射通过 qt_static_metacall(..)
运行,它是 FileIndex
的成员,因此具有受保护的访问权限。
'new' 样式语法确实有效,但 for this reason 不会让您直接获取父 class 方法的地址。但是它会占用 indexAll()
的 'inherited' 地址,所以只需将代码更改为:
connect(&_timer, &QTimer::timeout, this, &Derived::indexAll);
基础 class 中的声明如下所示:
protected:
void indexAll();
void cleanAll();
在导出的class中,以下不编译:
indexAll(); // OK
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll); // ERROR
connect(&_timer, SIGNAL(timeout()), this, SLOT(indexAll())); // OK
我想使用 connect
的第一个变体,因为它会进行一些编译时检查。为什么会返回错误:
error: 'void Files::FileIndex::indexAll()' is protected
void FileIndex::indexAll()
^
[...].cpp:246:58: error: within this context
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll);
^
第一个由正常的 C++ 可访问性规则规定。 QTimer::timeout 信号直接通过提供的函数指针调用 FileIndex::indexAll。当然,这只有在这个函数指针为public时才有可能(忽略可能的友解)。如果您使用函数指针,您甚至不需要在头文件中将函数标记为 SLOT。
第二个是moc魔法。通过元对象系统调用。我从来没有更深入地研究过这个话题……它只是奏效了。 :-)
好吧,这不是最好的解释。如果您想了解更多信息:
http://woboq.com/blog/new-signals-slots-syntax-in-qt5.html
http://woboq.com/blog/how-qt-signals-slots-work.html
http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
不错的读物,但是...只有当您对 Qt 的更深层次的工作感兴趣时才会感兴趣。恕我直言,仅当您想开发 Qt 本身时才需要。
'old' 样式语法有效,因为信号发射通过 qt_static_metacall(..)
运行,它是 FileIndex
的成员,因此具有受保护的访问权限。
'new' 样式语法确实有效,但 for this reason 不会让您直接获取父 class 方法的地址。但是它会占用 indexAll()
的 'inherited' 地址,所以只需将代码更改为:
connect(&_timer, &QTimer::timeout, this, &Derived::indexAll);