Qt 如果线程是该对象的子线程,则为QObject.moveToThread(线程)

Qt 如果线程是该对象的子线程,则为QObject.moveToThread(线程),qt,qt4,pyqt,qthread,qobject,Qt,Qt4,Pyqt,Qthread,Qobject,我想创建QObject(对象),子对象QThread(线程)作为父对象(用于在对象处于活动状态时保持线程处于活动状态),并生成对象。moveToThread(thread),但在这种情况下启动线程的信号不起作用 简单地说: 对象拥有线程 对象移动到线程 信号启动线程不工作 发生了什么事?[编辑]:由于评论,我放弃了最初的答案 也许可以这样做: 创建对象 创建线程,但不要为其指定父线程 像往常一样,将线程的finished()信号连接到其deleteLater()插槽 将对象的deleted()信

我想创建
QObject
(对象),子对象
QThread
(线程)作为父对象(用于在对象处于活动状态时保持线程处于活动状态),并生成
对象。moveToThread(thread)
,但在这种情况下启动线程的信号不起作用

简单地说:

  • 对象拥有线程
  • 对象移动到线程
  • 信号启动线程不工作

  • 发生了什么事?

    [编辑]:由于评论,我放弃了最初的答案

    也许可以这样做:

  • 创建对象
  • 创建线程,但不要为其指定父线程
  • 像往常一样,将线程的finished()信号连接到其deleteLater()插槽
  • 将对象的deleted()信号连接到线程的stop()插槽

  • 然后,当您删除对象时,它将发出deleted(),这将停止线程。线程将发出finished(),它将调用它的deleteLater()插槽。

    [Edit]:由于注释的原因,我将丢弃我的初始答案

    也许可以这样做:

  • 创建对象
  • 创建线程,但不要为其指定父线程
  • 像往常一样,将线程的finished()信号连接到其deleteLater()插槽
  • 将对象的deleted()信号连接到线程的stop()插槽

  • 然后,当您删除对象时,它将发出deleted(),这将停止线程。线程将发出finished(),它将调用其deleteLater()插槽。

    能否显示connect()语句?还有,你试过它是否返回真值吗?@Tim Meyer,“还有,你试过它是否返回真值吗?”是的,它返回真值。如果我将其他
    QObject
    设置为线程的父对象-这没关系,一切都可以。@Tim Meyer,我创建了函数(
    object.start()
    ),从对象发出
    started()
    信号,并将对象的
    started()
    信号连接到线程的
    start()
    插槽。我通过调用
    object.start()
    函数来启动线程。发出
    object.started()
    信号在所有情况下都是正常的,但是
    thread
    只有在他是另一个
    QObject
    的子对象时才会启动。您能显示connect()语句吗?还有,你试过它是否返回真值吗?@Tim Meyer,“还有,你试过它是否返回真值吗?”是的,它返回真值。如果我将其他
    QObject
    设置为线程的父对象-这没关系,一切都可以。@Tim Meyer,我创建了函数(
    object.start()
    ),从对象发出
    started()
    信号,并将对象的
    started()
    信号连接到线程的
    start()
    插槽。我通过调用
    object.start()
    函数来启动线程。发布<代码>对象.Stad()/<代码>信号在所有情况下都是正确的,但是<代码>线程< /代码>只有在他是另一个代码“qObjult< /Cuth>”的孩子时才开始。@ Tym Mey',“TestObject拥有线程”——我不知道C++,并且不能检查这个代码,但是我理解上面代码的某些部分。也许我错了,但当我们创建必须由某个Obj拥有的线程时,我们创建QThread(parent=Obj),然后线程由Obj拥有。或者,如果我们直接调用thread.setParent(Obj)——也是一样的。在本例中,对象不拥有线程,但将线程作为其自身的参数。我已经考虑过了,我不需要这种行为。哦,我忽略了你的pyqt标签,对不起。事实上,当我设置父对象时,它不再起作用。在Qt中,C++中的每个QObjt都可能有一个父对象,但它不必具有父对象。这和PyQt不同吗?不,没有意义。但我需要设置parent,使其保持
    QObject
    作为线程的容器,并使用很酷的接口
    th=container.findChild(QThread,name=“awesom\u thread\u 56”)
    调用
    thread.setParent(0)
    ,然后线程可能会通过析构函数自动从容器中删除。或者,如果我只是删除线程,它会从父
    QObject
    的子线程中删除。若并没有对线程的引用,那个么它将被完全删除。对于内存管理来说,将线程的
    finished()
    信号与线程的
    deleteLater
    插槽连接起来也很有用。然后,层次化对象的魔力就会发生。只有将QThread子类化并从thread访问对象时,才会出现问题。是的,您不能启动它所使用的对象的子线程。如果有的话,对象应该是thread@Tym迈耶:“TestObject拥有这个线程”——我不知道C++,不能检查这个代码,但是我理解上面代码的某些部分。也许我错了,但当我们创建必须由某个Obj拥有的线程时,我们创建QThread(parent=Obj),然后线程由Obj拥有。或者,如果我们直接调用thread.setParent(Obj)——也是一样的。在本例中,对象不拥有线程,但将线程作为其自身的参数。我已经考虑过了,我不需要这种行为。哦,我忽略了你的pyqt标签,对不起。事实上,当我设置父对象时,它不再起作用。在Qt中,C++中的每个QObjt都可能有一个父对象,但它不必具有父对象。这和PyQt不同吗?不,没有意义。但我需要设置parent,使其保持
    QObject
    作为线程的容器,并使用很酷的接口
    th=container.findChild(QThread,name=“awesom\u thread\u 56”)
    调用
    thread.setParent(0)
    ,然后线程可能会通过析构函数自动从容器中删除。或者,如果我只是删除线程,它会从父
    QObject
    的子线程中删除。若并没有对线程的引用,那个么它将被完全删除。对于内存管理来说,将线程的
    finished()
    信号与线程的
    deleteLater
    插槽连接起来也很有用。然后,层次化对象的魔力就会发生。只有将QThread子类化并从thread访问对象时,才会出现问题。是的,您不能启动它所使用的对象的子线程。如果有的话,对象应该是thre的子对象