В моем приложении мы имеем простую связь между сигнальным слотом.
connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject));
Эта связь, к сожалению, приведет к рекурсии. Затем мы изменили его в
connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject)), Qt::QueuedConnection);
и это больше не работает. Слот никогда не называется.
Я пытался изменить myObject
для QString
и работает как положено. Так что проблема в чем-то myObject
что Qt не очень любит.
Я проверил Класс Qt.ConnectionType, сигналы & игровые автоматы а также QObject doc, находясь в поиске Qt::QueuedConnection
но я не нашел разъяснения для моей ситуации.
Некоторые заметки о моем коде:
myObject
разрушается сразу после испускания сигнала. Но это не должно быть проблемой, копия могла быть сделана (как я полагаю, для QString, которая не имеет этой проблемы, я имею в виду, даже если я передаю временный QString
и уничтожить его сразу после выдачи сигнала, слот в любом случае называется как положено)
myObject
это не QObject
и никто из его членов не является QObject
(если это может иметь какое-то влияние)
myObject
МОЖЕТ быть скопировано
Моя заявка является ОДНОЙ веткой
myObject
не имеет конструктора по умолчанию (но я не думаю, что это должно влиять на него, так как копия может быть сделана)
Я использую Qt 5.7
У кого-нибудь есть какое-то разъяснение по этой проблеме?
Собственно, документация Qt::QueuedConnection
кажется, не так подробно, см. ссылки, которые я разместил выше. У вас есть еще полезная ссылка?
Зарегистрируйте свой myObject:
qRegisterMetaType<MyObject>("myObject");
где MyObject — это имя класса. доктор
Между тем, Qt :: QueuedConnection для соединения через потоки, вы используете потоки?
Других решений пока нет …