使用这个简单的代码来运行基于qdialog的窗口:
import maya.OpenMayaUI as mui
import sip
from PyQt4 import QtGui, QtCore, uic
#----------------------------------------------------------------------
def getMayaWindow():
ptr = mui.MQtUtil.mainWindow()
return sip.wrapinstance(long(ptr), QtCore.QObject)
#----------------------------------------------------------------------
form_class, base_class = uic.loadUiType('perforceBrowserWnd.ui')
#----------------------------------------------------------------------
class PerforceWindow(base_class, form_class):
def __init__(self, parent=getMayaWindow()):
super(base_class, self).__init__(parent)
self.setupUi(self)
#----------------------------------------------------------------------
def perforceBrowser2():
perforceBrowserWnd = PerforceWindow()
perforceBrowserWnd.show()
perforceBrowser2()
每次运行perforceBrowser2()函数时都会有一个新的windows副本。
如何查找窗口是否已经运行而不是打开它的新副本,然后转到打开的窗口?或者只是不给脚本运行第二个窗口副本?
PS。 maya2014 + pyqt4 + python2.7
答案 0 :(得分:2)
保持对窗口的全局引用:
perforceBrowserWnd = None
def perforceBrowser2():
global perforceBrowserWnd
if perforceBrowserWnd is None:
perforceBrowserWnd = PerforceWindow()
perforceBrowserWnd.show()
答案 1 :(得分:0)
使用全球不是首选的方式,并且有大量的文章为什么这是一个坏主意。
Why are global variables evil? 记住类的静态var中的实例以及加载UI时更清楚,检查它是否已经存在并返回它,如果没有创建它。 (有一种称为Singleton的模式也描述了这种行为)
import sys
from Qt import QtGui, QtWidgets, QtCore
class Foo(QtWidgets.QDialog):
instance = None
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
self.setWindowTitle('Test')
def loadUI():
if not Foo.instance:
Foo.instance = Foo()
Foo.instance.show()
Foo.instance.raise_()
loadUI()
无论何时调用loadUI,它都将返回相同的UI,并且不会在每次调用时重新创建。