1、QT的信号和槽之间关联,系统默认是线程内,默认不支持跨线程调用,因此如果需要跨线程信号传递,则需要再connect的第五个参数:
Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。
2、绑定的消息,如果参数为自定义的数据体,则需要进行注册数据体,系统默认常用的类型变量,如果自定义结构体,则需创建连接之间注册一次,语法:qRegisterMetaType<MyStruct >("MyStruct ")
在上面的代码中,我们使用了一个名为 qRegisterMetaType 的函数来注册我们的结构体。这个函数是 Qt 库中的一个工具,它允许我们向元数据系统注册自定义的数据类型,以便在程序中方便地使用它们。 我们通过传递结构体的类型参数来注册我们的数据类型。在这个例子中,我们传递了名为 MyStruct 的结构体作为参数,并给它赋予了一个字符串 'MyStruct' 的标识符。 一旦我们成功地注册了 MyStruct 数据类型,我们就可以在程序中通过这个标识符来访问它。例如,我们可以使用 qMetaTypeId 函数来获取 MyStruct 的类型 ID,或者使用 qRegisterMetaType 函数来注册其他结构体或类。 值得注意的是,qRegisterMetaType 函数在程序启动时只会执行一次,因此我们需要确保在需要使用自定义数据类型的地方正确地引入了它。
3.偶尔会遇到一个对象的在某些情况下会被多次connect的情况,为了应对这个情况需要
在connect操作的时候加上flag:Qt::UniqueConnection
例如:
-
QObject a;
-
QObject b;
connect(&a, &QObject::signal, &b, &QObject::slot, Qt::UniqueConnection);
-
connect(&a, &QObject::signal, &b, &QObject::slot, Qt::UniqueConnection);
这样之后第二次connect将会失败,可以避免多次connect之后发送一个信号触发多个槽的情况。