簡單的解決方案是將回調註冊添加到您的widget的__init__
:
class Info(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.initUI()
nuke.addOnScriptSave(self.updateInfo)
if nuke.root().name() == 'Root' and not nuke.modified():
# No reason to add a scriptLoad callback if opening a
# script would spawn a new Nuke process.
nuke.addOnScriptLoad(self.updateInfo)
# Rest of the class definition omitted for brevity
這種方法確實有一個顯着的缺點:由於Nuke的回調註冊表現在至少包含一個對小部件的方法updateInfo
的引用,所以該小部件永遠不會被Python垃圾回收。在現實生活中,這可能永遠不會太大,因爲你可能只創建極少數的面板實例,但是如果你創建了1000個實例,那麼你將有1000個回調被註冊,這永遠不會是未註冊(即使面板已關閉)。
不幸的是,Nuke並沒有真正給你任何掛鉤實施,當你的小部件被從UI中刪除,所以很難有一個肯定的方式知道是時候註銷你的回調。
class Info(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.initUI()
self.callbacksRegistered = False
def addCallbacks(self):
nuke.addOnScriptSave(self.updateInfo)
if nuke.root().name() == 'Root' and not nuke.modified():
# No reason to add a scriptLoad callback if opening a
# script would spawn a new Nuke process.
nuke.addOnScriptLoad(self.updateInfo)
def removeCallbacks(self):
self.removeOnScriptSave(self.updateInfo)
self.removeOnScriptLoad(self.updateInfo)
def showEvent(self, event):
if not (self.callbacksRegistered or event.spontaneous()):
self.addCallbacks()
self.callbacksRegistered = True
def hideEvent(self, event):
if self.callbacksRegistered and not event.spontaneous():
# "Spontaneous" hide events are sent when the Nuke
# window is minimized, which we don't really care
# about.
self.removeCallbacks()
self.callbacksRegistered = False
# Rest of the class definition omitted for brevity
回調註冊移入showEvent
方法和回調是未註冊當小部件被其他的東西隱藏的:你可以很可能使用showEvent
/hideEvent
組合和一些猜測,像這樣的最接近比操作系統級的窗口操作。這非常可靠,除了當您切換到小部件窗格中的另一個選項卡(如果它已停靠)時,您的回調也將被取消註冊。當你的標籤被再次激活時,它們顯然會被重新添加。這是一個相當小的懲罰,但我仍然認爲值得指出的是,雖然這種方法非常接近理想,但並不完美。
無論如何,我會留給你決定哪兩個你更喜歡哪一個,但我希望這有助於。
非常感謝 – Ash 2014-12-08 06:47:06