我正在创建一个滑块,根据从中心点拖动的距离来“扭曲”值。我想通过使用踏板进行翘曲来正确地做到这一点。这是我实际计时的主题:
class WarpThread(QtCore.QThread):
errorHappened = False
# This will be a semaphore used to wake up the warper thead when the slider
# is being manipulated. It starts at 0. Upon sliderPressed, it is set to +1.
# when the slider is released, it is set -1 again. The thread then will
# wait on the semiphore till it is > 0. When it is, it steps up our value,
# sleeps and then waits again
doWarp = None
updateWarp = Signal()
def __init__(self, parent = None):
super(WarpThread, self).__init__(parent)
self.exiting = False
self.doWarp = QtCore.QSemaphore(0)
def run(self):
while True:
self.doWarp.acquire()
if self.exiting:
break
self.updateWarp.emit()
self.doWarp.release()
QtCore.QThread.msleep(50)
# === External function calls ===
def startWarping(self):
self.doWarp.release() # Allow the thread to start looping
def stopWarping(self):
self.doWarp.acquire()
def stopThread(self):
self.exiting = True
self.doWarp.release()
self.wait()
因此,Warp Slider只在收到信号startWarping
时拨打sliderPressed
,在收到stopWarping
时拨打sliderReleased
。一切都很好。计划是在具有滑块的东西stopThread
内调用__del__
。好吧,当我在没有做任何事情的情况下关闭GUI时,它会很好地关闭。当我使用滑块后退出时,出现QThread: Destroyed while thread is still running
错误。我试图让线程不是滑块的父线程(认为Qt可能会通过继承树销毁它),但这似乎没有做任何事情。所以我想我不明白线程何时被销毁。
Qt是否会破坏不在x-ed输出GUI的整个父子树中的对象?
为什么不使用该线程停止小部件__del__
中的线程似乎有效?
为什么使用东西后只会出现问题?
如果您有有用的链接,请将其留在评论中。我很难找到答案,因为我缺乏有效搜索的词汇
修改
此外,我知道一些建议只是让线程全局以确保它们不会被杀死,但是每个滑块都有一个线程......也许这就是需要改变的设计点...继续