<p>我们说清楚。<strong>您的代码没有按预期工作。</strong>框架就是这样告诉您的。</p>
<blockquote>
<p>QObject::setParent: Cannot set parent, new parent is in a different
thread</p>
</blockquote>
<p>这意味着某个对象(可疑的<code>myClass</code>)的所有插槽和信号将不会在预期的线程中执行。这里的问题是关于<code>myClass</code>和<code>classX</code>对象的父对象</p>
<p><strong>可能性I:myClass->;moveToThread(&;myClassThread);失败</strong></p>
<p><strong><em>原因:</em></strong>myClass已设置父级。这是禁止的。</p>
<p>这意味着<code>init()</code>将由线程对象<code>myClassThread</code>的线程触发。从线程和事件角度看,这几乎与</p>
<pre><code>MyClass * myClass = new MyClass(classX);
QMetaObject::invokeMethod(myClass, "init", Qt::QueuedConnection);
</code></pre>
<p><strong>可能性二:init()违反线程关联性</strong></p>
<p><strong><em>原因:</em></strong>`classX``或一个神秘的相关对象已经设置了父对象或不能移动到另一个线程。想想小部件。</p>
<p><code>moveToThread</code>成功,一个线程中有<code>MyClass</code>,另一个线程中有<code>classX</code>。在构造<code>myClass</code>时提供了<code>classX</code>。<code>myClass</code>现在正在处理另一个线程中的对象,如果没有进一步的代码,我们就无法假定线程安全或正确的子父关联。仔细检查<code>MyClass</code>::MyClass`和MyClass::init。</p>
<p><strong>哪一个正在发生?</strong></p>
<p>在控制器代码中中断调试器并查看线程id。然后在<code>init</code>方法中中断调试器。</p>
<ul>
<li>如果是同一根线,第一种情况</li>
<li>否则就是第二种情况</li>
</ul>