Qt,作为信号发送参考时的数据完整性
如果我发送一个引用对象的信号,我是否有任何保证,在对象受到程序其他部分的更改之前,插槽将处理该信号Qt,作为信号发送参考时的数据完整性,qt,signals-slots,qt-signals,Qt,Signals Slots,Qt Signals,如果我发送一个引用对象的信号,我是否有任何保证,在对象受到程序其他部分的更改之前,插槽将处理该信号 或者我必须发送一份带有信号的物体的深度副本才能确定吗 以下条件成立:信号返回时: 已调用所有直接连接的插槽 已调用所有阻塞排队连接的插槽 所有具有排队连接插槽的目标对象都向其发布了相关的QMetaCallEvent 因此,如果您的其他代码允许,并且连接是: 直接的 阻塞队列,或 与当前线程中的目标对象自动关联 对于这些连接类型,在signal方法返回之前将调用所有插槽。回想一下,信号是其他的普
或者我必须发送一份带有信号的物体的深度副本才能确定吗 以下条件成立:信号返回时:
QMetaCallEvent
- 直接的
- 阻塞队列,或
- 与当前线程中的目标对象自动关联李>
- 排队,或
- 自动,目标对象位于当前线程以外的线程中
//main.cpp
#include <QDebug>
class Data {
int m_i;
public:
Data(const Data & o) : m_i(o.m_i) {
qDebug() << "copy constructed";
}
Data(int i = 0) : m_i(i) {
qDebug() << "constructed";
}
Data(Data && o) : m_i(o.m_i) {
qDebug() << "move constructed";
}
~Data() {
qDebug() << "destructed";
}
int i() const { return m_i; }
};
Q_DECLARE_METATYPE(Data)
QDebug operator<<(QDebug dbg, const Data & d)
{
dbg << "Data:" << d.i();
return dbg;
}
class Object : public QObject {
Q_OBJECT
public:
Q_SIGNAL void source(const Data &);
Q_SLOT void sink(const Data & d) {
qDebug() << "sinking" << d;
}
};
int main()
{
qDebug() << QT_VERSION_STR;
Object o;
o.connect(&o, SIGNAL(source(Data)), SLOT(sink(Data)));
emit o.source(Data(2));
return 0;
}
#include "main.moc"
以下情况适用:信号返回时:
QMetaCallEvent
- 直接的
- 阻塞队列,或
- 与当前线程中的目标对象自动关联李>
- 排队,或
- 自动,目标对象位于当前线程以外的线程中
//main.cpp
#include <QDebug>
class Data {
int m_i;
public:
Data(const Data & o) : m_i(o.m_i) {
qDebug() << "copy constructed";
}
Data(int i = 0) : m_i(i) {
qDebug() << "constructed";
}
Data(Data && o) : m_i(o.m_i) {
qDebug() << "move constructed";
}
~Data() {
qDebug() << "destructed";
}
int i() const { return m_i; }
};
Q_DECLARE_METATYPE(Data)
QDebug operator<<(QDebug dbg, const Data & d)
{
dbg << "Data:" << d.i();
return dbg;
}
class Object : public QObject {
Q_OBJECT
public:
Q_SIGNAL void source(const Data &);
Q_SLOT void sink(const Data & d) {
qDebug() << "sinking" << d;
}
};
int main()
{
qDebug() << QT_VERSION_STR;
Object o;
o.connect(&o, SIGNAL(source(Data)), SLOT(sink(Data)));
emit o.source(Data(2));
return 0;
}
#include "main.moc"
以下情况适用:信号返回时:
QMetaCallEvent
- 直接的
- 阻塞队列,或
- 与当前线程中的目标对象自动关联李>
- 排队,或
- 自动,目标对象位于当前线程以外的线程中
//main.cpp
#include <QDebug>
class Data {
int m_i;
public:
Data(const Data & o) : m_i(o.m_i) {
qDebug() << "copy constructed";
}
Data(int i = 0) : m_i(i) {
qDebug() << "constructed";
}
Data(Data && o) : m_i(o.m_i) {
qDebug() << "move constructed";
}
~Data() {
qDebug() << "destructed";
}
int i() const { return m_i; }
};
Q_DECLARE_METATYPE(Data)
QDebug operator<<(QDebug dbg, const Data & d)
{
dbg << "Data:" << d.i();
return dbg;
}
class Object : public QObject {
Q_OBJECT
public:
Q_SIGNAL void source(const Data &);
Q_SLOT void sink(const Data & d) {
qDebug() << "sinking" << d;
}
};
int main()
{
qDebug() << QT_VERSION_STR;
Object o;
o.connect(&o, SIGNAL(source(Data)), SLOT(sink(Data)));
emit o.source(Data(2));
return 0;
}
#include "main.moc"
以下情况适用:信号返回时:
QMetaCallEvent
- 直接的
- 阻塞队列,或
- 与当前线程中的目标对象自动关联李>