转载自:点击打开链接
第3点坑我好多回!!!
1、一个子类的父类没有继承自QObject,当此子类想要实现自定义信号时,可以使用多重继承,但是必须将public QObject,放在第一个位置,否则编译器会报error C2039:staticMetaObject is not a member of "xxx"。
2、跨线程使用自定义信号时,保持connect函数最后一个参数Qt::ConnectionType,为default类型: type = Qt::AutoConnection,或者type=Qt::QueuedConnection,其中Qt::AutoConnection,可以根据信号和槽是否属于同一线程自动判断该使用何种ConnectionType,Qt::QueuedConnection类型表示信号和槽不属于同一线程,Qt::DirectConnection类型表示信号和槽属于同一线程。换句话就是,使用跨线程singal和slot时,connect函数的ConnectionType可以为Qt::QueuedConnection或保持默认。如果在同一线程中使用ConnectionType可以为Qt::DirectConnection或保持默认。
两种ConnectionType区别如下:
Qt::DirecConnection:
当信号发出时,槽函数立即执行,信号和槽一定在同一线程中。
Qt::QueuedConnection:
当信号发出后,当控制流返回到接受者线程的事件循环中时,槽函数在接收者线程执行。
3、对于自定义类型,通过singal和slot传递时,必须使用qRegisterMetaType("xx")注册为元数据类型。